Есть ли что-то вроде специальной переменной совпадения с регулярным выражением? - PullRequest
1 голос
/ 25 октября 2011

У меня есть следующий пример кода

#!/usr/bin/perl
use strict;
use warnings;

my $b = "Size: 200 GB";
if ($b =~ /Size: (\d+) GB/) {
    my $match1 = $1;
    print "Match1 : $match1\n";
}

my $match2;
my $c = "Size:  GB";
$c =~ /Size: (\d+) GB/;
$match2 = $1;
print "Match2 : $match2\n";

Если я запускаю этот код как есть, $ match2 получает значение 200, потому что $ 1 назначено 200 из предыдущего блока.Если $ c = "Размер: 400 ГБ", то $ match2 становится 400, потому что отсюда заполняются значения $ 1: $ c = ~ / Size: (\ d +) GB /;Я могу решить эту проблему, поместив оператор if, например if ($ c = ~ / Size: (\ d +) GB /) {$ match2 = $ 1;} Но есть ли лучший способ сбрасывать значение $ 1 каждый раз?

Ответы [ 4 ]

8 голосов
/ 25 октября 2011

Вам придется использовать версию if(). Поскольку ваше $c регулярное выражение ничего не соответствует, захват не производится, поэтому предыдущие захваты остаются на месте. Этот не-сброс выполнен в соответствии с http://perldoc.perl.org/perlre.html#Capture-groups:

ПРИМЕЧАНИЕ. Неудачные совпадения в Perl не сбрасывают переменные совпадения, что делает его проще написать код, который проверяет ряд более конкретных случаев и запоминает лучший матч.

2 голосов
/ 26 октября 2011

Используйте «совпадение в контексте списка», чтобы получить перехваты (если есть):

my($match2) = $c =~ /Size: (\d+) GB/;

Если совпадение не удастся, $ match2 получит значение undef (т.е. это будет «сброс»));

1 голос
/ 25 октября 2011

Вы можете использовать and, чтобы установить переменную только в случае совпадения:

my $match2;
$c =~ /Size: (\d+) GB/ and $match2 = $1;

Если совпадения нет, $match2 будет неопределенным.

1 голос
/ 25 октября 2011

Проверьте соответствие:

my $match2;
my $c = "Size:  GB";
if( $c =~ /Size: (\d+) GB/ ) {
   $match2 = $1;
   print "Match2 : $match2\n";
}

В противном случае вы не знаете, действительно ли строка соответствует регулярному выражению.

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