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) { ... }