Perl Regex в операторе if [Синтаксис] - PullRequest
12 голосов
/ 08 апреля 2011

До сих пор, если я хотел сгруппировать несколько регулярных выражений внутри оператора if и if, я сделал это следующим образом:

my $data =...
if ( $data =~ m/regex/ && $data =~ m/secondregex/ ) {...}

Есть ли ярлык (и я уверен, что это Perl!), Чтобы избежать повторения $ data, что-то вроде:

if ( $data =~ m/regex/ && m/secondregex/ ) {..}

??

Спасибо,

Ответы [ 7 ]

18 голосов
/ 08 апреля 2011

Используйте переменную по умолчанию $_, например:

$_ = $data;
if ( m/regex/ && m/secondregex/ ) {..}

как регулярные выражения действуют по умолчанию на $_ (как и многие другие в Perl).

Просто убедитесь, что вы не находитесь в блоке, где $ _ заполняется автоматически, и вам нужно будет использовать его позже в этом блоке. Как только он перезаписан, он ушел.

14 голосов
/ 08 апреля 2011
for ($data) {
    if (/regex/ && /secondregex/) {...}
}
7 голосов
/ 08 апреля 2011

Только одна строка с использованием умного соответствия:

use 5.010;
if ($data ~~ [qr/regex1/,qr/regex2/]) { ... }
2 голосов
/ 08 апреля 2011

Еще одно предложение. В зависимости от того, как долго ваш список регулярных выражений вам нужно сопоставить в одном if, и как часто вам нужно делать такие добрые вещи, было бы разумно превратить это в подпрограмму.

Вдохновленный каждым Рубином:

sub matchesAll ($@) {
  my $string = shift;
  my $result = 1;
  foreach $_ (@_) {
    $result &&= $string =~ $_;
  }
  $result;
}

А потом сделай

if (matchesAll $data, $regex1, $regex2, $regex3, $regex4) ...

Примечание: для этого необходимо, чтобы все регулярные выражения были скомпилированы для будущего использования с использованием qr // $regex1 = qr/regex1/

1 голос
/ 08 апреля 2011

Добавить в список способов положить $data в $_:

if ( grep { m/regex/ && m/secondregex/ } $data ) {...}
0 голосов
/ 09 апреля 2011

Правильный способ преобразования

if (/re1/ && /re2/ && /re3/) { ... }

в один шаблон заключается в следующем:

if (/(?=.*re1)(?=.*re2)(?=.*re3)/s) { ... }
0 голосов
/ 08 апреля 2011

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

, то есть: изменив

if (/regex1/ && /regex2/) block1 
elsif (/regex2/ && /regex3/) block2 

на

if (/regex2/){ 
  if (/regex1/) block1
  else (/regex3/) block2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...