到目前为止,如果我想将几个正则表达式组合在一起并且if语句中,我就是这样做的:
my $data =...
if ( $data =~ m/regex/ && $data =~ m/secondregex/ ) {...}
是否有快捷方式(我确定有,它的Perl!)以避免重复$ data,例如:
if ( $data =~ m/regex/ && m/secondregex/ ) {..}
...
谢谢,
答案 0 :(得分:18)
使用默认变量$_
,如下所示:
$_ = $data;
if ( m/regex/ && m/secondregex/ ) {..}
因为正则表达式默认作用于$_
(与Perl中的许多其他内容一样)。
请确保您不在自动填充$ _的块中,您将需要在此块中稍后使用它。一旦它被覆盖它就消失了。
答案 1 :(得分:14)
for ($data) {
if (/regex/ && /secondregex/) {...}
}
答案 2 :(得分:7)
只有一行使用智能匹配:
use 5.010;
if ($data ~~ [qr/regex1/,qr/regex2/]) { ... }
答案 3 :(得分:2)
还有一个建议。根据你需要在一个中匹配的正则表列表的长度,如果你需要做这种事情的频率,将它变成一个子程序会很有意义。
灵感来自红宝石的每一个:
sub matchesAll ($@) {
my $string = shift;
my $result = 1;
foreach $_ (@_) {
$result &&= $string =~ $_;
}
$result;
}
然后再做
if (matchesAll $data, $regex1, $regex2, $regex3, $regex4) ...
注意:这需要使用qr // $regex1 = qr/regex1/
答案 4 :(得分:1)
添加到将$data
放入$_
的方式列表:
if ( grep { m/regex/ && m/secondregex/ } $data ) {...}
答案 5 :(得分:0)
取决于您的条件结构。您也可以使用嵌套ifs重构一些正则表达式。
即:改变
if (/regex1/ && /regex2/) block1
elsif (/regex2/ && /regex3/) block2
到
if (/regex2/){
if (/regex1/) block1
else (/regex3/) block2
}
答案 6 :(得分:0)
正确的改变方式
if (/re1/ && /re2/ && /re3/) { ... }
以这种方式进入单一模式:
if (/(?=.*re1)(?=.*re2)(?=.*re3)/s) { ... }