if条件的差异

时间:2016-02-02 02:46:49

标签: perl

我在探索一些有效的代码时发现了这一点。 同样在perl编码中我仍然是新手。这是我的问题: 此IF条件之间的差异

if ($command =~ /send|regd|succ|fail|recv/)

和这一个

if ( ($command == "send") || ($command == "regd") || ($command == "succ")
     || ($command == "fail") || ($command == "recv"))

3 个答案:

答案 0 :(得分:5)

首先,正如评论者所提到的,==进行了数字比较。如果字符串看起来不像数字,则其数值为0,因此如果使用==,则$ command可能看起来等于所有这些字符串。比较字符串的正确方法是使用eq,例如if ($command eq "send")

即使使用正确的等式运算符,仍然存在差异。第一个版本使用模式匹配,并且模式没有锚定,因此它可以匹配字符串中的任何位置。例如,如果$command是" blahblahsendxxxxxx",则$command =~ /send/为真。您可以通过在开头放置^和在结尾放置$来确定它是否与整个字符串匹配。

答案 1 :(得分:1)

正如Andy所说,你需要使用eq而不是==,并且应该使用你的正则表达式。在这种情况下,您也不需要在括号内的||链中包装每个条件。

有2个差异'我能想到:性能和可读性。 ' ||'链更具性能,但只是轻微的。如果你添加了更多的术语,正则表达式最终会击败它。正则表达式可能更易读,更容易扩展和修改。

这是我用来检查效果的基准。

use Benchmark 'cmpthese';

my $cmd = 'recv';

cmpthese( -1, {
    REG => sub {
        if ($cmd =~ /^(?:send|regd|succ|fail|recv)$/) {
            return 1;
        }   
    },  
    OR  => sub {
        if ($cmd eq 'send'||$cmd eq 'regd'||$cmd eq 'succ'||$cmd eq 'fail'||$cmd eq 'recv') {
            return 1;
        }   
    },  
});

我正在检查recv,因为链中的最后一个应该是最慢的。

但是,如果它的性能是您的,请在脚本顶部定义有效命令的哈希值。稍后,您可以检查哈希是否包含该命令键。它是最快捷的方法。它也非常易读,并且可以通过其他命令轻松扩展。

my %valid = map { $_ => 1 } qw( send regd succ fail recv );
# Later ...
if ( $valid{$cmd} ) { return 1; }

答案 2 :(得分:0)

第一个条件的说明:字符串" $ command"匹配文本的任何文本/部分与值"发送"或" regd"或" succ"或"失败"或" recv"不论位置如何。

第二个条件的解释:应该是第二个代码语法     if($ command eq" send" || $ command eq" regd" || $ command eq" succ" || $ command eq" fail&# 34; || $ command eq" recv")而不是上述的那个。与第一个条件不同,在第二个条件中,字符串$命令应与文本完全匹配"发送"或" regd"或" succ"或"失败"或" recv"