代码之家  ›  专栏  ›  技术社区  ›  Bee H.

while循环在检查错误值时找不到regex

  •  0
  • Bee H.  · 技术社区  · 8 年前

    我正在编写一个脚本,收集公司计算机的各种规格,并将其存储到数据库中。脚本的一部分在文件中搜索连接到计算机的信用卡读卡器的序列号。

    我发现,如果在while条件中不包含true/false检查,那么正则表达式将被匹配,我可以从中中断。没关系,这就是我要做的。但我不明白,为什么当我将while条件更改为包含true/false检查时,regex永远不匹配。

    这是我找到的工作

    use v5.10;
    use warnings;
    use strict;
    
    my $test;
    open(my $fh, "<", "\\\\192.168.0.132\\storeman\\log\\2018-06-22.sls");
    while(my $line = <$fh>){
        if($line =~ /unitid/i){
            $line =~ /(\d{3}\-\d{3}\-\d{3})/;
            $test = $1;
            last;
        }
    };
    say $test // "Nothing found";
    

    但另一方面,下面的方法不起作用。

    use v5.10;
    use warnings;
    use strict;
    
    my $test;
    open(my $fh, "<", "\\\\192.168.0.132\\storeman\\log\\2018-06-22.sls");
    while(my $line = <$fh> && !$test){
        if($line =~ /unitid/i){
            $line =~ /(\d{3}\-\d{3}\-\d{3})/;
            $test = $1;
        }
    };
    say $test // "Nothing found";
    

    注意在每种情况下, $test 未声明,直到正则表达式找到匹配。而且,即使在宣布 $测试 作为一个空字符串,并尝试 && $test ne "" ,regex仍然不匹配。

    我已经尽我所能调试了,我只知道当使用 && !$test ,和 if($line =~ /unitid/i) 从来没有发现是真的。

    这是关于 &&!$测试 这可能会导致regex永远不匹配,从而导致循环永远不会中断,而是运行整个文件?

    1 回复  |  直到 8 年前
        1
  •  3
  •   bytepusher    8 年前

    考虑 <$fh> && !$test -这是一个布尔上下文。Perl将返回上次评估的语句-在这种情况下 !$test 是的。从那以后 $test 是未定义的,是真的,所以1。

    因此, $line 现在将包含1。与你的正则表达式不匹配:)

    如果你愿意,你可以写 while( !$test && (my $line = <$fh>) ){ , 然后就会像你想象的那样。你甚至可以 while( my $line = !$test && <$fh> ) -但我不建议这么做,因为这有点让人困惑(正如你注意到的)。