Обнаружить разницу совпадений в контексте списка с регулярным выражением захвата против регулярного выражения? - PullRequest
6 голосов
/ 22 мая 2011

Согласно perlretut

... в скалярном контексте $time =~ /(\d\d):(\d\d):(\d\d)/ возвращает значение true или false.В контексте списка, однако, он возвращает список совпадающих значений ($1,$2,$3).

Но я не могу найти объяснение того, что возвращается в контексте списка, если шаблон соответствует, когда нет захватагруппы в регулярном выражении.Тестирование показывает, что это список (1) (один элемент, целое число 1).(Вспомогательный вопрос - всегда ли это будет, где это определено?)

Это затрудняет выполнение того, что я хочу:

if (my @captures = ($input =~ $regexp)) {
    furtherProcessing(@captures);
}

Я хочу, чтобы furtherProcessing вызывался, еслиесть совпадение с любыми захваченными группами, переданными в качестве аргументов.Проблема возникает, когда $regexp не содержит групп захвата, потому что тогда я хочу, чтобы furtherProcessing вызывался без аргументов, а не со значением 1, как это происходит выше.Я не могу проверить (1) как особый случай, например

if (my @captures = ($input =~ $regexp)) {
    shift @captures if $captures[0] == 1;
    furtherProcessing(@captures);
}

, потому что в случае

$input = 'a value:1';
$regexp = qr/value:(\S+)/;

в @captures есть захваченное значение, которое происходитвыглядеть так же, как и я, когда $regexp совпадает, но не имеет групп захвата.

Есть ли способ сделать то, что я хочу?

1 Ответ

8 голосов
/ 22 мая 2011

Вы можете использовать $#+, чтобы узнать, сколько групп было в последнем успешном матче. Если это 0, то не было никаких групп и у вас есть (1). (Да, всегда будет (1), если нет групп, как указано в perlop .)

Итак, это будет делать то, что вы хотите:

if (my @captures = ($input =~ $regexp)) {
    @captures = () unless $#+; # Only want actual capture groups
    furtherProcessing(@captures);
}

Обратите внимание, что $#+ подсчитывает все группы, независимо от того, совпадают они или нет (при условии совпадения всего RE). Таким образом, "hello" =~ /hello( world)?/ вернет 1 группу, даже если группа не совпадает (значение в @captures будет undef).

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