Arrays Perl变量不';t即使设置为“t”,也不要保持不变;我们的";

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

我有一个文件,我希望搜索字符串,与数组中存储的项目匹配。我打开文件,循环浏览它,当我找到我要查找的内容时,我会更改一个变量标志,以便可以做更多的工作。我遇到了一个问题,我设置的变量没有粘住。我将变量放在foreach循环中,使其成为
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});
}