我正在使用Perl 5.16.3并遇到以下问题
我有使用以下代码读取Config :: General格式文件的代码:
use Config::General qw(ParseConfig);
my $meta_file = "/foo/bar/file";
my $hash;
eval {
$hash = {ParseConfig($meta_file)};
};
if ($@) {
print $@;
}
Run Code Online (Sandbox Code Playgroud)
现在,当文件指向buy $ meta_file出现问题时,此代码将失败,并且堆栈跟踪类似于以下内容:
在数字eq(==)中使用未初始化的值$ n_read Config :: General :: _ openfile_for_read('Config :: General = HASH(0xff92e30)','/ foo / bar / file')Config :: General :: _ open( 'Config :: General = HASH(0xff92e30)','/ foo / bar / file')Config :: General :: _ process('Config :: General = HASH(0xff92e30)')Config :: General :: new(' Config :: General','/ foo / bar …
我需要设计一个简单的计算器在Perl只有ex1.pl叫+,-,*,和/功能。以下是我所拥有的。
while (@ARGV>0) {
if ($_=~m/(\d+)\s(.)\s(\d+)/) {
if ($2 == "+") {
print "$1 + $3\n";
}
elsif ($2 == "-") {
print "$1 - $3\n";
}
elsif ($2 == "*") {
print "$1 * $3\n";
}
elsif ($2 == "/") {
if ($3 == 0 ) {
print "$1 cannot be divided by 0\n";
}
else {
print "$1 / $3\n";
}
}
else {
print "operator not identified\n";
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个大的数据文件dump.all.lammpstrj,我需要拆分/归类到一系列文件,如Z_1_filename,Z_2_filename,Z_3_filename等基于每个记录的坐标.
坐标以无序方式保存,因此我的程序读取每一行并确定应将此记录发送到哪个文件.
我用变量, $filehandle = "Z_$i_DUMP"
我希望打开所有可能的文件
for ( my $i = 1; $i <= 100; $i++ ) {
$filehandle = "Z_$i_DUMP";
open $filehandle,'>', "Z_$i_dump.all.lammpstrj.dat";
...
}
Run Code Online (Sandbox Code Playgroud)
但是在运行我的程序时,我收到了一条消息
不能使用字符串("Z_90_DUMP")作为符号引用,而"严格引用"在...中使用
我不想扫描每个输出文件的所有数据,因为dump.all.lammpstrj扫描需要很长时间.
有没有办法将定义的变量用作文件句柄?
我有这样的数据
>sp|Q96A73|P33MX_HUMAN Putative monooxygenase p33MONOX OS=Homo sapiens OX=9606 GN=KIAA1191 PE=1 SV=1
RNDDDDTSVCLGTRQCSWFAGCTNRTWNSSAVPLIGLPNTQDYKWVDRNSGLTWSGNDTCLYSCQNQTKGLLYQLFRNLFCSYGLTEAHGKWRCADASITNDKGHDGHRTPTWWLTGSNLTLSVNNSGLFFLCGNGVYKGFPPKWSGRCGLGYLVPSLTRYLTLNASQITNLRSFIHKVTPHR
>sp|P13674|P4HA1_HUMAN Prolyl 4-hydroxylase subunit alpha-1 OS=Homo sapiens OX=9606 GN=P4HA1 PE=1 SV=2
VECCPNCRGTGMQIRIHQIGPGMVQQIQSVCMECQGHGERISPKDRCKSCNGRKIVREKKILEVHIDKGMKDGQKITFHGEGDQEPGLEPGDIIIVLDQKDHAVFTRRGEDLFMCMDIQLVEALCGFQKPISTLDNRTIVITSHPGQIVKHGDIKCVLNEGMPIYRRPYEKGRLIIEFKVNFPENGFLSPDKLSLLEKLLPERKEVEE
>sp|Q7Z4N8|P4HA3_HUMAN Prolyl 4-hydroxylase subunit alpha-3 OS=Homo sapiens OX=9606 GN=P4HA3 PE=1 SV=1
MTEQMTLRGTLKGHNGWVTQIATTPQFPDMILSASRDKTIIMWKLTRDETNYGIPQRALRGHSHFVSDVVISSDGQFALSGSWDGTLRLWDLTTGTTTRRFVGHTKDVLSVAFSSDNRQIVSGSRDKTIKLWNTLGVCKYTVQDESHSEWVSCVRFSPNSSNPIIVSCGWDKLVKVWNLANCKLK
>sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens OX=9606 GN=TP53 PE=1 SV=4
IQVVSRCRLRHTEVLPAEEENDSLGADGTHGAGAMESAAGVLIKLFCVHTKALQDVQIRFQPQL
>sp|P10144|GRAB_HUMAN Granzyme B OS=Homo sapiens OX=9606 GN=GZMB PE=1 SV=2
MQPILLLLAFLLLPRADAGEIIGGHEAKPHSRPYMAYLMIWDQKSLKRCGGFLIRDDFVLTAAHCWGSSINVTLGAHNIKEQEPTQQFIPVKRPIPHPAYNPKNFSNDIMLLQLERKAKRTRAVQPLRLPSNKAQVKPGQTCSVAGWGQTAPLGKHSHTLQEVKMTVQEDRKCES
>sp|Q9UHX1|PUF60_HUMAN Poly(U)-binding-splicing factor PUF60 OS=Homo sapiens OX=9606 GN=PUF60 PE=1 SV=1
MGKDYYQTLGLARGASDEEIKRAYRRQALRYHPDKNKEPGAEEKFKEIAEAYDVLSDPRKREIFDRYGEEGLKGSGPSGGSGGGANGTSFSYTFHGDPHAMFAEFFGGRNPFDTFFGQRNGEEGMDIDDPFSGFPMGMGGFTNVNFGRSRSAQEPARKKQDPPVTHDLRVSLEEIYSGCTKKMKISHK
>sp|Q06416|P5F1B_HUMAN Putative POU domain, class 5, transcription factor 1B OS=Homo sapiens …Run Code Online (Sandbox Code Playgroud) 您好,我是 Perl 的新手,我想知道如何使用它来替换多行模式下的正则表达式。如果可能的话,也制作“。” 与断线相匹配。
我正在使用以下表达式:
perl -pe 's/text.*end/textChanged/g' myFile.txt
Run Code Online (Sandbox Code Playgroud)
上面的表达式替换为单行模式。它不考虑断线。
使用: Windows Stranberry Perl
我在一个示例脚本中找到了它,然后我从Google搜索并找到了以下单词,
请注意,您不能简单地将STDERR打开为Perl程序中STDOUT的副本,并避免调用Shell进行重定向。这不起作用:
Run Code Online (Sandbox Code Playgroud)open(STDERR, ">&STDOUT");之所以失败,是因为open()使STDERR转到open()时STDOUT所在的位置。然后,反引号使STDOUT转到字符串,但不要更改STDERR(仍将其转到旧的STDOUT)。
现在我很困惑。到底是什么意思open(STDERR, ">&STDOUT");?
所以我有几个 XML 文件,其中包含具有唯一 ID 的人,并且每个人都有自己喜欢的食物(一个人可以在多个 xml 文件中):
在某些情况下,id=300 的人可能会在标签的开头吃到食物。
<person id="299">
<food>
<type> Hot Dog </type>
</food>
</person>
<person id="300">
<food>
<type> Burger</type>
</food>
</person>
Run Code Online (Sandbox Code Playgroud)
或者在食物标签之前可能还有其他标签
<person id="300">
<year>
<birth> 1990 </birth>
<marriage> 2020 </marriage>
</year>
<food>
<type> Vegan </type>
</food>
</person>
Run Code Online (Sandbox Code Playgroud)
我需要使用单个 Perl RegEx 函数来删除 ID 为 300 的人的食物标签,如果它在人标签的开头、中间或结尾,则独立
我知道如果是整个人标签,我可以使用类似的东西:
$fileContents =~ s/<person id=\"300\"[^<]+<\/person>//g;
Run Code Online (Sandbox Code Playgroud)
但是我必须完整地保留人员标签,我只能移除人员标签内的食物标签,但我无法移除所有食物标签,因为我需要将其留给其他 ID 的人。
请问你能帮帮我吗??我一直在为这个 D 苦苦挣扎:
许多客户端在 sqlite 数据库上查询时的众所周知的问题:数据库被锁定
我想增加在 Linux 上等待锁定释放的延迟(以毫秒为单位),以消除此错误。
从 sqlite-command 中,我可以使用例如(4 秒):
sqlite> .timeout 4000
sqlite>
Run Code Online (Sandbox Code Playgroud)
我已经启动了许多进行选择/插入/删除的进程,如果我不使用 sqlite-command 设置此值,我有时会得到:
sqlite> select * from items where code like '%30';
Error: database is locked
sqlite>
Run Code Online (Sandbox Code Playgroud)
那么 .timeout 的默认值是多少?
在 Perl 5.10 程序中,我有时也会遇到此错误,尽管默认值似乎是 30.000(所以 30 秒,未记录)。
程序在出现此错误之前实际上等待了 30 秒吗?如果是,这看起来很疯狂,即使该数据库上正在运行许多其他进程,数据库至少有一段时间是空闲的
my $dbh = DBI->connect($database,"","") or die "cannot connect $DBI::errstr";
my $to = $dbh->sqlite_busy_timeout(); # $to get the value 30000
Run Code Online (Sandbox Code Playgroud)
谢谢!
对于某些 Perl 诊断测试,我使用 JSON::MaybeXS 记录格式化为 JSON 的各种信息。
当我想记录当前的 Perl 版本(从特殊变量 $^V 获取)时,出现错误。
正如最小的演示脚本所示,除非我将 $^V 引用为“$^V”,否则会发生错误。
#!/usr/bin/env perl
use strict;
use warnings;
use v5.18;
use JSON::MaybeXS;
say "Running Perl version $^V";
my $item = 'Wut?';
my %hash1 = (
something => $item,
v_unquoted => $^V
);
eval { say say 'Hash1: ', encode_json \%hash1 };
say "Oops - JSON encode error: $@" if $@;
my %hash2 = (
something => $item,
v_quoted => "$^V"
);
say 'Hash2: ', encode_json \%hash2; …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个 XML 文档。特别是,如下
<spirit:component xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4"
xmlns:vendorExtensions="$IREG_GEN/XMLSchema/SPIRIT"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="$IREG_GEN/XMLSchema/SPIRIT/VendorExtensions.xsd
http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4
http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4/index.xsd">
Run Code Online (Sandbox Code Playgroud)
所以我为此制作了一个 perl 脚本,如下所示
use strict;
use warnings;
use Spreadsheet::ParseXLSX;
use XML::LibXML;
my $doc = XML::LibXML::Document->new('1.0', 'utf-8');
my $root = $doc->createElement('spirit:component');
#$root->appendChild($doc->createComment("JJ"));
$root->setAttribute('xmlns:spirit'=> "http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4");
$root->setAttribute('xmlns:vendorExtensions'=> "\$IREG_GEN/XMLSchema/SPIRIT");
$root->setAttribute('xmlns:xsi'=> "http://www.w3.org/2001/XMLSchema-instance");
$root->setAttribute('xsi:schemaLocation'=> "http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4
http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4
http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4/index.xsd");
$doc->setDocumentElement($root);
print $doc->toString(1);
Run Code Online (Sandbox Code Playgroud)
但问题是我得到了结果
<spirit:component xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4" xmlns:vendorExtensions="$IREG_GEN/XMLSchema/SPIRIT" xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4 											http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4 											http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4/index.xsd"/>
Run Code Online (Sandbox Code Playgroud)
特别是,这里有两个问题	,index.xsd"/>
我可以删除换行符,然后按如下方式解决它
$root->setAttribute('xsi:schemaLocation'=> "http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1
.4 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4/index.xsd");
Run Code Online (Sandbox Code Playgroud)
特别是,我怎样才能/删除index.xsd"/>?我使用了错误的功能吗?