我正在处理一个脚本,该脚本收集我公司计算机的各种规格,并将其存储到数据库中。脚本的一个部分在文件中搜索与计算机相连的信用卡阅读器的序列号。
我发现的是,如果在while条件中不包括true / false检查,则将匹配正则表达式,并且我可以从那里中断。很好,这就是我要处理的。我不明白,为什么,当我更改while条件以包括true / false检查时,正则表达式永远不会匹配。
这是我发现的作品
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
声明为空字符串并尝试&& $test ne ""
,该正则表达式也永远不会匹配。
我已经尽力调试了,我所知道的是,在使用&& !$test
时,从未发现if($line =~ /unitid/i)
是真的。
&& !$test
有什么可能导致正则表达式不匹配,从而使循环永不中断,而是遍历整个文件?
答案 0 :(得分:3)
考虑返回<$fh> && !$test
-这是一个布尔上下文。 Perl将返回最后计算的语句-在这种情况下为!$test
。由于$test
未定义,因此为真,所以1。
因此,$line
现在将包含1。这与您的正则表达式不匹配:)
如果愿意,您可以写while( !$test && (my $line = <$fh>) ){
,
这样便可以像您期望的那样运行。你甚至可以做
while( my $line = !$test && <$fh> )
-但我不建议这样做,因为这有点令人困惑(如您所注意到的;))。