我在探索一些有效的代码时发现了这一点。 同样在perl编码中我仍然是新手。这是我的问题: 此IF条件之间的差异?
if ($command =~ /send|regd|succ|fail|recv/)
和这一个
if ( ($command == "send") || ($command == "regd") || ($command == "succ")
|| ($command == "fail") || ($command == "recv"))
答案 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"