【问题标题】:While loop will not find regex when checking for false value检查错误值时,while循环将找不到正则表达式
【发布时间】:2018-12-04 10:52:08
【问题描述】:

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

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

这是我找到的作品

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";

但另一方面,follow 不起作用。

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 声明为空字符串并尝试&amp;&amp; $test ne "",正则表达式仍然永远不会匹配。

我已尽我所能进行了调试,我所知道的是,在使用 &amp;&amp; !$test 时,永远不会发现 if($line =~ /unitid/i) 是真的。

&amp;&amp; !$test 的什么原因可能导致正则表达式永远不匹配,从而导致循环永远不会中断,而是贯穿整个文件?

【问题讨论】:

    标签: perl loops


    【解决方案1】:

    考虑&lt;$fh&gt; &amp;&amp; !$test 的返回——这是一个布尔上下文。 Perl 将返回最后评估的语句——在本例中为!$test。其中,由于 $test 未定义,因此为真,所以 1。

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

    如果你愿意,你可以写while( !$test &amp;&amp; (my $line = &lt;$fh&gt;) ){, 然后它的行为就像你预期的那样。你甚至可以做 while( my $line = !$test &amp;&amp; &lt;$fh&gt; ) - 但我不建议这样做,因为它有点令人困惑(正如您所注意到的;))。

    【讨论】:

    • 谢谢,这确实有效。我只是想确保我正确理解你。所以,while(my $line = &lt;$fh&gt; &amp;&amp; !$test) 隐含地评估像 while(my $line = (&lt;$fh&gt; &amp;&amp; !$test))?
    • 是的,这是由于运算符优先级。如果不是这种情况,布尔语句根本不适用于赋值,请考虑 my $check = $true &amp;&amp; $false - 如果括号不同,$check 会突然为真,我们会被难住 :)
    • 我不知道这一点,但这是一个非常好的花絮!
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多