使用and
运算符链接的语句链而不是if
链接&&
的多个条件,是否是惯用的Perl?
示例:而不是
if ($foo && bar() && baz()) {
do_something();
}
使用:
$foo and bar() and baz() and do_something();
答案 0 :(得分:3)
您可能希望阅读Damian Conway的 Perl Best Practices 。康威先生一直在努力解决很多这些问题,并将他的发现纳入本书。
归结为用户期望的内容。当您对操作进行链接时,可能很容易错过最后一项是您执行的操作而不仅仅是另一个布尔语句
$foo and bar and baz() and do_something();
通过使其成为真正的if
语句,可以更容易地看到您有条件,如果该条件是 true ,则执行子例程{{1} }。
我更喜欢使用do_something
代替and
:
&&
这使得很容易看出你有三个条件,如果它们被满足,你就会运行一些东西。我喜欢if ($foo and bar() and baz()) {
do_something();
}
,因为它更容易阅读,因此理解起来要快一点,并且因为它的低于<{em>>优先于and
,并且似乎在某些地方效果更好:
&&
工作时间:
open my $file, "<", $foo or die qq(Can't open "$foo" for reading);
除非您在open my $file "<", $foo || die qq(Can't open "$foo" for reading);
语句周围添加括号,否则不会:
open
有些人说你可以使用postfix open ( my $file "<", $foo ) || die qq(Can't open "$foo" for reading);
,但Conway并不推荐它:
if
根据康威的说法,很容易错过有条件的错过。他建议在命令很短时使用它,这是一种摆脱异常的方法:
do_something() if $foo and bar() and baz();
优先于此:
while ( my $foo = < $bar_fh > ) {
next if $foo eq $bar;
...
}
Conway说while ( my $foo = < $bar_fh > ) {
if ($foo eq $bar) {
next;
}
...
}
语句很简短,它处理异常。换句话说,除非您发现next
等于$foo
,否则您正在进行循环。在第二种情况下,你会失去这种流量。
同样,如果您有这些类型的问题(这些都是好问题。我希望更多人对更好的编码结构和可读性感兴趣),请阅读 Perl最佳实践。
答案 1 :(得分:2)
作为
的替代方案if ($foo && bar() && baz()) {
do_something();
}
可以使用
do_something() if $foo && bar() && baz();
保留条件与所需操作的分离,并带来简单性,如$x && $y && $z
。
答案 2 :(得分:0)
我的问题更多的是针对意见而不是确切的答案,引发了很多评论。
只是总结一下,评论者发现if ($foo && bar() && baz) { do() }
对我的同伴们来说比扁平链更容易$foo and bar() and baz() and do();