Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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使用and而不是if_Perl - Fatal编程技术网

Perl使用and而不是if

Perl使用and而不是if,perl,Perl,Perl惯用的做法是使用and运算符链接的语句链,而不是使用带有&&链接的多个条件的if吗 例:代替 if ($foo && bar() && baz()) { do_something(); } 使用: 作为替代 if ($foo && bar() && baz()) { do_something(); } 它可以被使用 do_something() if $foo && bar() &

Perl惯用的做法是使用and运算符链接的语句链,而不是使用带有&&链接的多个条件的if吗

例:代替

if ($foo && bar() && baz()) {
    do_something();
}
使用:

作为替代

if ($foo && bar() && baz()) {
    do_something();
}
它可以被使用

do_something() if $foo && bar() && baz();

它保留了条件与所需操作的分离,并带来了简单性,如$x&&$y&&$z。

我的问题更多地是为了发表意见,而不是给出确切的答案,引发了大量的评论

总结一下,评论者们发现,如果$foo&&bar&&baz{do}比扁平链$foo and bar and baz and do对我的人类同胞更容易一些

您可能想阅读Damian Conway的Perl最佳实践。康威先生一直在努力解决这些问题,并将他的发现写在这本书中

这取决于用户的期望。当您链接操作时,很容易忽略最后一项是您执行的,而不仅仅是另一个布尔语句

$foo and bar and baz() and do_something();
通过将其设置为true if语句,可以更容易地看到您有一个条件,如果该条件为true,则执行子例程do_something

我更喜欢使用and而不是&:


这很容易看出您有三个条件,如果满足了这些条件,那么您正在运行一些东西。我喜欢和,因为它更容易阅读,理解起来稍微快一点,因为它的优先级比&低,而且在某些地方似乎效果更好:

open my $file, "<", $foo or die qq(Can't open "$foo" for reading);
有人说,如果出现以下情况,您可以使用后缀,但康威不推荐:

do_something() if $foo and bar() and baz();
根据康威的说法,很容易错过有条件的考试。他建议在命令较短时使用此命令,这是一种摆脱异常的方法:

while ( my $foo = < $bar_fh > ) {
    next if $foo eq $bar;
    ...
}
优先于此:

while ( my $foo = < $bar_fh > ) {
    if ($foo eq $bar) {
        next;
    }
    ...
}
Conway说下一个语句很短,它正在处理一个异常。换句话说,除非您发现$foo等于bar,否则您正在执行循环。在第二种情况下,你会失去这种流动


同样,如果你有这些类型的问题,这些都是好问题。我希望更多的人对更好的编码结构和可读性感兴趣,请阅读Perl最佳实践。

如果您想了解和和的区别,请阅读。TL;医生:除非你知道自己在做什么,否则使用和。它是否是惯用的很可能是基于观点的,而且是离题的。您应该知道,使用短路和运算符的链接语句将在第一次失败时停止执行。例如,如果0&&foo&&bar将永远不会运行foo或bar。如果运行链中的每个步骤非常重要,那么您应该事先从每个步骤中提取一个返回值,例如my$foo=foo;如果$foo…在您的示例中,无论您是否使用and或&&,这都是一条好规则。@SzG Yes。正如我所说,简单的答案是:使用和使用。我在这里的意思是,你似乎在区分和&在这个上下文中没有逻辑意义。如果你问吃水果对你是否有好处,晚上吃苹果还是早上吃橙子更好?至于我对你这个话题的看法,我会在任何我希望其他人阅读的代码中使用if。原因是什么?它更加明确。没有人会因为你在编程时太含糊而感谢你。这使得你很容易看到你有三个条件,更难看到。一组单词中的符号比一组单词中的特定单词更容易识别。解析dfs sadfs和dfsaf以及fdsfs asd和asdsa比解析dfs sadfs&&dfsaf&&fdsfs asd&&asdsa更困难。这就是运算符通常是符号的原因。这很容易看出有三个条件是使用if语句而不是链接引用的。我喜欢and&或是因为他们做了我通常打算做的事情。康威提到了这一点,但随后建议&&和| |,因为它们似乎没有引起相同程度的恐惧、不确定性或怀疑不确定性?怀疑如果盯着$done | |$count>=$max看几个小时,想知道为什么它不起作用,怎么样?如果$done或$count>=$max有效。如果你想让我停止使用不必要的括号,我用的是and和or,谢谢?如果$done或$count>=$max有效,那么$done | |$count>=$max也有效。这个习惯用法是使用or来控制流,如果后面跟着next、return等,或者| |否则。这是一个微优化,但是在热代码路径中,$foo和do或do if$foo可能比if$foo{do}更受欢迎。卷曲意味着词汇范围;词法作用域需要一个设置操作和一个拆卸操作。
open ( my $file "<", $foo ) || die qq(Can't open "$foo" for reading);
do_something() if $foo and bar() and baz();
while ( my $foo = < $bar_fh > ) {
    next if $foo eq $bar;
    ...
}
while ( my $foo = < $bar_fh > ) {
    if ($foo eq $bar) {
        next;
    }
    ...
}