Perl if条件的差异
我在探索一些工作代码时发现了这一点。 同样在perl编码方面,我还是个新手。我的问题是: 此IF条件之间的区别是什么Perl if条件的差异,perl,Perl,我在探索一些工作代码时发现了这一点。 同样在perl编码方面,我还是个新手。我的问题是: 此IF条件之间的区别是什么 if ($command =~ /send|regd|succ|fail|recv/) 这个呢 if ( ($command == "send") || ($command == "regd") || ($command == "succ") || ($command == "fail") || ($command == "recv")) 首先,正如评论员提到的,=
if ($command =~ /send|regd|succ|fail|recv/)
这个呢
if ( ($command == "send") || ($command == "regd") || ($command == "succ")
|| ($command == "fail") || ($command == "recv"))
首先,正如评论员提到的,==进行数字比较。如果一个字符串看起来不像一个数字,那么它的数值是0,所以如果使用==的话,$命令很可能看起来等于所有这些字符串。比较字符串的正确方法是使用eq,例如,
if($command eq“send”)
即使使用正确的相等运算符,仍然存在差异。第一个版本使用模式匹配,并且模式没有被锚定,因此它可以匹配字符串中的任何位置。例如,如果
$command
为“blahblahsendxxxxxx”,则$command=~/send/
为真。您可以通过在开头放置一个“^”,在结尾放置一个$来锚定模式以确保它与整个字符串匹配。正如Andy提到的,您需要使用eq
而不是==
,并且应该锚定正则表达式。在本例中,您也不需要将|
链中的每个条件都用括号括起来
我能想到两个“区别”:性能和可读性。“| |”链的性能更高,但仅稍有提高。如果你增加更多的条款,正则表达式最终会战胜它。正则表达式可能更具可读性,更易于扩展和修改
这是我用来检查性能的基准
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; }
对第一个条件的解释:字符串“$command”将文本的任何文本/部分与值“send”或“regd”或“succ”或“fail”或“recv”匹配,而与位置无关 第二个条件的解释:第二个代码语法应该是
如果($command eq“send”| |$command eq“regd”| |$command eq“succ”| |$command eq“fail”| |$command eq“recv”)而不是上述选项。与第一种情况不同,在第二种情况下,string$命令应与文本“send”或“regd”或“succ”或“fail”或“recv”完全匹配。if语句使用数值相等运算符
==
测试字符串。这应该是eq
,字符串相等运算符。第一个将匹配太多-任何包含send、regd等的字符串。如果提供的名称不匹配,比较会变得更糟(因此传递到测试的单词之一是cataclysm
或structural
或其他内容)。然后每次它都必须做更多的工作来确定它不匹配,而正则表达式可以更快地检测到不匹配。像failure
或success
这样的词会使正则表达式工作得更多一些(它必须处理4个字符,而不是仅仅1个字符),但随着备选方案数量的增加,它会更快。@Joshua我很感谢您在性能和可读性之间给出的答案。我以后会考虑编码的。全面质量管理。干杯。谢谢你的回答和简单的解释。:)