Пока цикл не найдет регулярное выражение при проверке на ложное значение - PullRequest
0 голосов
/ 25 июня 2018

Я работаю над сценарием, который собирает различные спецификации компьютеров моих компаний и сохраняет их в базе данных.Один из разделов скрипта ищет в файле серийный номер устройства чтения кредитных карт, подключенного к компьютеру.

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

1 Ответ

0 голосов
/ 25 июня 2018

Рассмотрим возвращение <$fh> && !$test - это логический контекст.Perl вернет последний оцененный оператор - в этом случае !$test.Что, поскольку $test не определено, является истинным, поэтому 1.

Таким образом, $line теперь будет содержать 1. Что не соответствует вашему регулярному выражению:)

Если вы хотитеВы можете написать while( !$test && (my $line = <$fh>) ){, который будет вести себя так, как вы ожидали.Вы могли бы даже сделать while( my $line = !$test && <$fh> ) - но я бы не советовал, поскольку это немного сбивает с толку (как вы заметили;)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...