对于本声明:
if ($SDescription =~ m/$sdescription_1/gi or $SDescription =~ m/$sdescription_2/gi){
#...
}
除了打印$SDescription
以手动比较之外,是否可以判断哪个$SDescription
匹配:$sdescription_1
或$sdescription_2
?
答案 0 :(得分:7)
在标量上下文中,=~
运算符返回匹配数。如果没有/g
修饰符,则匹配数为0或1,因此您可以执行类似
$match_val = ($SDescription =~ m/$sdescription_1/i)
+ 2 * ($SDescription =~ m/$sdescription_2/i);
if ($match_val) {
if ($match_val == 1) { ... } # matched first regex
if ($match_val == 2) { ... } # matched second regex
if ($match_val == 3) { ... } # matched both regex
}
答案 1 :(得分:3)
你有什么理由不想写这样的东西吗? (/g
修饰符是超级的,除非您在以后的匹配中使用\G
锚点:模式匹配或不匹配。)
if ($SDescription =~ /$sdescription_1/i) {
# Do stuff for first pattern
}
elsif ($SDescription =~ /$sdescription_2/i) {
# Do stuff for second pattern
}
答案 2 :(得分:0)
您可以使用非匹配组(?:)来完成此操作。对于你的代码,我会尝试这样的事情:
if ($SDescription =~ m/((?:$sdescription_1))|((?:$sdescription_2))/gi) {
# $1 will hold a value IFF $sdescription_1 matches
# $2 will hold a value IFF $sdescription_2 matches
}
哪个匹配的“字符串”或模式应显示在$ 1或$ 2中。见下面的测试程序:
测试程序:
$str1 = "TEST1";
$str2 = "TEST2";
#Match results on $str1 (group 1)
$str1 =~ /((?:TEST1))|((?:TEST2))/;
print "[$1] [$2]\n";
#Match results on $str2 (group 2)
$str2 =~ /((?:TEST1))|((?:TEST2))/;
print "[$1] [$2]\n";
返回结果:
[TEST1] []
[] [TEST2]