什么Perl匹配正则表达式的细微差别可能导致头痛?

时间:2012-07-26 17:41:13

标签: regex perl

此代码无法识别出似乎标识的任何键:

if( $key =~ /upsf|free|ground|sla|pickup|usps/ )

所以我把它改成了:

    if( $key eq 'upsf' || $key eq 'free' 
    || $key eq 'ground' || $key eq 'sla' 
    || $key eq 'pickup' || $key eq 'usps' )

他们认为我们功能相同,所以我试图找出第一个失败的原因。它是在Windows 7上的XAMPP下的Perl,但它也是在Linux机器上的Apache2下的Perl。

这会在Windows和Linux上打印“搁置它”。

$key = 'upsf';
if( $key =~ /^(upsf|free|ground|sla|pickup|usps)$/ ) {
    print 'ship it';
} else {
    print 'shelf it';
}

2 个答案:

答案 0 :(得分:3)

它们不是等价的,因为第一个中的比较运算符是“=〜”(“包含”), 在第二个中它是“eq”(“显式匹配,等于”)。

第一个怎么会失败? $ key的测试值是多少?

$key = 'xxx';
if( $key =~ /upsf|free|ground|sla|pickup|usps/ ) {
    print 'ship it';
} else {
    print 'shelf it';
}

将打印'搁置它'。   例如,$ key ='xusps'将打印'发送',匹配通过'=〜'运算符(“包含”),这可能不是您的目标。

答案 1 :(得分:0)

我的坏!

此代码由ClickCart Pro执行,它从文件中读取并按如下方式对其进行预处理:

$custom_script_code =~ s/\`/\'/gs;
$custom_script_code =~ s/\|\|/%7C%7C/g;
$custom_script_code =~ s/\|/ /gs;
$custom_script_code =~ s/%7C%7C/\|\|/g;
$custom_script_code =~ s/system/System/gs;
$custom_script_code =~ s/exec/Exec/gs;
$custom_script_code =~ s/die/Die/gs;

所以这里的第三个声明删除了管道。谢谢Kryptronics! (讽刺)perreal的评论已被加上。我不应该为此得到任何意见。对不起,我浪费了每个人的时间!