Как проверить, определен ли захват в соответствии с регулярным выражением Perl? - PullRequest
1 голос
/ 19 января 2012

Как проверить, определен ли захват в соответствии с регулярным выражением Perl?

#!/usr/bin/env perl
use v5.10;
my $str="foobar
barfoo";

while($str =~ m/(?:(f.*))|(?:(b.*))/g) {
    say "+ $1";
    say "- $2";
}

выводит

+ foobar
- 
+ 
- barfoo

пока я хочу

+ foobar
- barfoo

т.е. если $1 или $2 не совпадают, оно не должно печататься.

Ответы [ 3 ]

4 голосов
/ 19 января 2012

Дело в том, что вы не тестируете, если он определен, поэтому он будет печатать +/- в любом случае.

while($str =~ m/(?:(f.*))|(?:(b.*))/g) {
    say "+ $1" if defined($1);
    say "- $2" if defined($2);
}
2 голосов
/ 19 января 2012

Используйте функцию defined(...). Если $1 не определено, то defined($1) вернет false.

1 голос
/ 21 января 2012

Лучше не полагаться на побочные эффекты настройки $1 и друзей. Как вы продемонстрировали, это является причиной семейства ошибок, и его следует избегать. Вместо этого просто используйте возвращаемые значения из оператора сопоставления.

while(my ($plus, $minus) = $str =~ m/(?:(f.*))|(?:(b.*))/g) {
    say "+ $plus";
    say "- $minus";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...