对于Perl条件,使用'if'与'unless'

JSB*_*ոգչ 49 perl if-statement readability

在Perl代码中最好使用ifvs的一些指导原则是什么unless?在某些情况下是否有充分理由偏好其中一种?

fri*_*edo 60

在Perl最佳实践中,建议永远不要使用unless.就个人而言,我认为这是疯狂的.

我用的unless时候有一个简单的条件,我本来写的if( ! ... ).我发现该unless版本更具可读性,尤其是在用作后缀时:

do_something() unless $should_not_do_that;
Run Code Online (Sandbox Code Playgroud)

我建议避免unless任何时候事情变得更复杂,例如当你有elsifelse阻止时.(幸运的是,或许不幸的是,根据你的观点,没有elsunless)

此外,任何时候条件是由其他布尔组成的复杂表达式.例如,

unless( $foo and !$bar )
Run Code Online (Sandbox Code Playgroud)

非常混乱,并没有相应的优势if.

  • 对于复杂的表达式,我不认为"除非"需要自动避免.`if(!($ foo and!$ bar))`不一定更清楚,程序员不应该(也可能不想)应用DeMorgan的定理来获得更清洁的`if(!$ foo或$ bar) )`. (5认同)
  • @Michael没有应用DeMorgan定理的问题在于,下一个程序员在阅读代码时必须将其应用于脑中.我最近在工作中遇到了一些代码,比如`除非($ obj-> has_errors ||!$ obj-> is_valid){返回1}#错误处理代码如下"或英文"如果先前的操作是对象不成功不运行错误处理代码." (4认同)
  • +1提及Perl最佳实践,并且没有. (3认同)

Mic*_*man 35

除了一个深奥的案例1 unless,只是语法糖if !.它的存在是为了让您编写更清晰,更具表现力的代码.它应该在实现这一目标时使用,并在它受到损害时避开.

我发现unless对循环中的流控制最有用.例如

while (<$fh>) {
    next unless /\S/;
    # ...
}
Run Code Online (Sandbox Code Playgroud)

对于简单的否定,我发现它比否定更清晰if- !在阅读代码时很容易错过领导.

unless ($condition) {
    do_something();
}

if (!$condition) {
    do_something();
}
Run Code Online (Sandbox Code Playgroud)

但是不要写unless ... else,因为那只是不和谐.

在后缀形式中,它提供了有关通过代码的预期路径的提示.

do_normal_thing() unless $some_unlikely_condition;
Run Code Online (Sandbox Code Playgroud)


1)评估的最后一个表达式是不同的,它可以在没有显式的情况下影响subs的行为return.

  • 非常好的回应.`除非`存在以提高可读性.请记住,其他一切都遵循. (3认同)
  • @ jfritz42:隐式返回值记录在[perlsub](http://perldoc.perl.org/perlsub.html#DESCRIPTION)中.关于隐式返回,`除非(EXPR)`和`if(!EXPR)`之间的区别没有文件记录; 这只是它们如何被使用的自然结果.假设EXPR为真(因此未输入条件块)且没有"else"块,则条件是最后一个求值表达式,因此其结果是隐式返回值.用`除非'表达式是'EXPR`(真),而用`if`表示`!EXPR`(假). (3认同)
  • 有时候,如果使用关键字"not"而不是"!",我会发现否定更清楚,例如:get_ready()如果​​不是$ ready; (2认同)

Gra*_*ean 12

根据经验,"除非"应该不经常使用.

它在后缀形式中特别有用,例如:

delete_old_widgets() unless $old_widget_count == 0
Run Code Online (Sandbox Code Playgroud)

除非您不应使用的情况:

  • 复合条件(和,或,不)
  • 用else子句


小智 9

我最近花了一个小时试图向某人解释两个嵌套的"除非"子句是如何工作的,如果没有将它们反转为具有布尔逻辑的if语句,则很难对decypher进行解释.

如果您尝试将其转换为英语,则有助于指导您.

一个简单的除非工作正常.例如.

"除非你安静,否则我会忽视你."

unless ($quiet) {
    ignore();
}
Run Code Online (Sandbox Code Playgroud)

虽然我认为这同样有效

"如果你不安静,我会忽视你"

if (not $quiet) {
    ignore();
}
Run Code Online (Sandbox Code Playgroud)

当它开始变得复杂的时候就是你有否定的时候.

"除非你不吵闹,否则我会忽视你"

unless ( ! $noisy) {
    ignore();
}
Run Code Online (Sandbox Code Playgroud)

写得好得多

"如果你很吵,我会不理你的话"

if ($noisy) {
    ignore();
}
Run Code Online (Sandbox Code Playgroud)

所以,如果你也有否定,不要使用'除非'.

也不要使用'除非'

unless ($quiet) {
    ignore();
}
else {
    give_a_sweet();
}
Run Code Online (Sandbox Code Playgroud)

"除非你安静,否则我会不理你,否则我会给你一个甜蜜的'

通过反转条件来改变它.

if ($quiet) {
    give_a_sweet();
}
else {
    ignore();
}
Run Code Online (Sandbox Code Playgroud)

"如果你安静,我会给你一个甜蜜的,否则我会不理你".

有一个以上的条件,它会变得混乱.

unless ($quiet and not $fidgit) {
    punish();
}
Run Code Online (Sandbox Code Playgroud)

"除非你安静,否则你不会狡猾,我会惩罚你."

(对不起,我的理解在这里失败了!)

再次,否定它.

if (not $quiet or $fidgit) {
    punish();
}
Run Code Online (Sandbox Code Playgroud)

"如果你不安静,或者你是骗子,我会惩罚你".

即使对于最简单的情况,使用'除非'的问题,他们经常(通过你自己或外面

我希望除非你应该或不应该使用它吗?

(除非你没有其他意见?)