Arrays Perl变量不';t即使设置为“t”,也不要保持不变;我们的";
我有一个文件,我希望搜索字符串,与数组中存储的项目匹配。我打开文件,循环浏览它,当我找到我要查找的内容时,我会更改一个变量标志,以便可以做更多的工作。我遇到了一个问题,我设置的变量没有粘住。我将变量放在foreach循环中,使其成为Arrays Perl变量不';t即使设置为“t”,也不要保持不变;我们的";,arrays,perl,loops,variables,global,Arrays,Perl,Loops,Variables,Global,我有一个文件,我希望搜索字符串,与数组中存储的项目匹配。我打开文件,循环浏览它,当我找到我要查找的内容时,我会更改一个变量标志,以便可以做更多的工作。我遇到了一个问题,我设置的变量没有粘住。我将变量放在foreach循环中,使其成为our变量,但没有效果 可疑代码: my$zed=0; foreach my$SUB(@SUB){ 打印“我们目前正在寻找$SUB”; 打开(我的$input),您正在测试中分配给$flag elsif ( $flag=1 && /<emai
our
变量,但没有效果
可疑代码:
my$zed=0;
foreach my$SUB(@SUB){
打印“我们目前正在寻找$SUB
”;
打开(我的$input),您正在测试中分配给$flag
elsif ( $flag=1 && /<email>(.+)/ ) { ... }
我建议您忘记$flag
,而是使用这样一个事实,即如果未找到$sub
,则输入文件将处于eof,因此程序将无法进一步读取任何内容
倒带文件比重新打开文件更好。几乎可以肯定的是,数据应该被解析成散列并直接访问,但我不能肯定,因为您提供的信息很少
my @sub;
open my $fh, '<', 'C:\Users\scottbro\Desktop\PMS.txt' or die "Cannot open PMS.txt: $!";
for my $sub ( @sub ) {
seek $fh, 0, 0;
while ( <$fh> ) {
last if /$sub/;
}
while ( <$fh> ) {
next unless /<email>(.+)/;
print qq{Email for "$sub" is "$1"};
last;
}
}
my@sub;
打开我的$fh,您在测试中分配给$flag
,而不是检查它的值
elsif ($flag = 1 && /<email>(.+)/)
elsif($flag=1&&/(.+)/)
应该是
elsif ($flag == 1 && /<email>(.+)/)
elsif($flag==1&&/(.+)/)
甚至更好
elsif ($flag && /<email>(.+)/)
elsif($flag&&/(.+)/)
也就是说,重复读取同一个文件效率很低
my $pat = join '|', map quotemeta, @subs;
my $qfn = 'C:\\Users\\scottbro\\Desktop\\PMS.txt';
open(my $fh, '<', $qfn)
or die(qq{"Can't open "$qfn": $!\n"});
while (<$fh>) {
my ($sub) = /($pat)/
or next;
defined( $_ = <$fh> )
or last;
my ($email) = /<email>(.+)/
or redo;
print(qq{Email for "$sub" is "$email"\n});
}
my$pat=join'|',map quotemeta,@subs;
my$qfn='C:\\Users\\scottbro\\Desktop\\PMS.txt';
打开(my$fh),还有,你为什么要多次读取输入?这很糟糕。@Sobrique完全同意,不知道你可以倒带。你可能甚至不需要这样做。你可以将你的/SUB/
搜索变成类似于:我的$search=join(|“,map{quotemeta}@SUB);$search=qr/($search)/因为这样你就可以做while(){if(m/$search/){print$1}}
看起来像通常的strict
和warnings
当你这样做的时候就不会出现了。@Sobrique:除非你写的东西总是对的或错的,比如if($f=1){…}
。OP的功能相当于if($f=/pattern/){…}
,这是一个合法的模式测试,同时存储结果以供重用/
在失败时返回dualvar(0',)
,而不是undef
(这将导致OP得到“未初始化”警告)@Borodin,我会看看你的建议,谢谢。将文件倒带并解析成散列非常有意义,至少可以说我的perl已经生锈了…@Borodin,你的回答让我在想计算flag时考虑分配它的值。将=改为==修复了很多没有意义的地方。我仍然想合并倒带和解析一个散列,但你确实让我克服了当前代码的障碍。谢谢!
my $pat = join '|', map quotemeta, @subs;
my $qfn = 'C:\\Users\\scottbro\\Desktop\\PMS.txt';
open(my $fh, '<', $qfn)
or die(qq{"Can't open "$qfn": $!\n"});
while (<$fh>) {
my ($sub) = /($pat)/
or next;
defined( $_ = <$fh> )
or last;
my ($email) = /<email>(.+)/
or redo;
print(qq{Email for "$sub" is "$email"\n});
}