Я работаю над сценарием, который собирает различные спецификации компьютеров моих компаний и сохраняет их в базе данных.Один из разделов скрипта ищет в файле серийный номер устройства чтения кредитных карт, подключенного к компьютеру.
Я обнаружил, что если я не включу проверку истинности / ложности в условие while, регулярное выражение будет соответствовать, и я могу выйти из этого.Это хорошо, и это то, с чем я собираюсь.Я не понимаю, однако, почему, когда я изменяю условие 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
, что может привести к тому, что регулярное выражение никогда не совпадет, и, таким образом, цикл никогда не прервется, а вместо этого пройдет черезвесь файл?