Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl if条件的差异_Perl - Fatal编程技术网

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")) 首先,正如评论员提到的,=

我在探索一些工作代码时发现了这一点。 同样在perl编码方面,我还是个新手。我的问题是: 此IF条件之间的区别是什么

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我很感谢您在性能和可读性之间给出的答案。我以后会考虑编码的。全面质量管理。干杯。谢谢你的回答和简单的解释。:)