Perl Regex в выражении if [Синтаксис]

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

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

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

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

??

Спасибо,

Ответ 1

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

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

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

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

Ответ 2

for ($data) {
    if (/regex/ && /secondregex/) {...}
}

Ответ 3

Только одна строка, использующая интеллектуальное совпадение:

use 5.010;
if ($data ~~ [qr/regex1/,qr/regex2/]) { ... }

Ответ 4

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

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

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

И затем сделайте

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

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

Ответ 5

Чтобы добавить к списку способов поставить $data в $_:

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

Ответ 6

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

т.е.: изменение

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

в

if (/regex2/){ 
  if (/regex1/) block1
  else (/regex3/) block2
}

Ответ 7

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

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

в один шаблон выглядит следующим образом:

if (/(?=.*re1)(?=.*re2)(?=.*re3)/s) { ... }