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

时间:2010-06-15 20:20:28

标签: perl if-statement readability

在Perl代码中,为了最好地使用ifunless,有哪些指导原则?在某些情况下是否有充分理由偏好其中一种?

9 个答案:

答案 0 :(得分:59)

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

只要有一个简单的条件我就会用unlessif( ! ... )。我发现unless版本更易读,特别是当用作后缀时:

do_something() unless $should_not_do_that;

我建议在事情变得更复杂的时候避免unless,例如当你有elsifelse块时。 (幸运的是,或许不幸的是,根据您的观点,没有elsunless

此外,条件是由其他布尔值组成的复杂表达式。例如,

unless( $foo and !$bar )

非常令人困惑,与同等if相比没有任何优势。

答案 1 :(得分:35)

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

我发现unless对循环中的流控制最有用。 e.g。

while (<$fh>) {
    next unless /\S/;
    # ...
}

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

unless ($condition) {
    do_something();
}

if (!$condition) {
    do_something();
}

但是不要写unless ... else,因为那只是一种刺激。

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

do_normal_thing() unless $some_unlikely_condition;

<小时/> 1)评估的最后一个表达式是不同的,它可以影响没有显式return的subs的行为。

答案 2 :(得分:12)

根据经验,“除非”应该不经常使用。

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

delete_old_widgets() unless $old_widget_count == 0

除非您不应使用的情况:

  • 具有复合条件(和,或,不是)
  • 使用else子句

答案 3 :(得分:9)

我最近花了一个小时试图向某人解释两个嵌套&#39;除非&#39;条款工作,很难decypher而不必将它们转换为带有布尔逻辑的if语句。

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

除非工作正常,否则很简单。例如。

&#39;除非你安静,否则我会忽视你。

unless ($quiet) {
    ignore();
}

虽然我认为这同样适用

&#39;如果你不安静,我会忽略你&#39;

if (not $quiet) {
    ignore();
}

当它开始变得复杂时,就是当你有否定时。

&#39;除非你没有吵闹,否则我会忽略你&#39;

unless ( ! $noisy) {
    ignore();
}

更好地写为

&#39;如果你吵闹,我会忽略你&#39;

if ($noisy) {
    ignore();
}

所以,不要使用&#39;除非&#39;如果你也有否定。

除非另有&#39;

,否则不要使用&#39;
unless ($quiet) {
    ignore();
}
else {
    give_a_sweet();
}

&#39;除非你安静,否则我会不理你,否则我会给你一个甜蜜的&#39;

通过反转条件来改变它。

if ($quiet) {
    give_a_sweet();
}
else {
    ignore();
}

&#39;如果你很安静,我会给你一个甜蜜的,否则我会忽略你的。

有多个条件,它会变得混乱。

unless ($quiet and not $fidgit) {
    punish();
}

&#39;除非你安静,否则你不会吝啬,否则我会惩罚你。

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

再次,否定它。

if (not $quiet or $fidgit) {
    punish();
}

&#39;如果你不安静,或者你不喜欢,我会惩罚你。

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

我希望在你应该或不应该使用时明确表示除非?

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

答案 4 :(得分:2)

虽然我理解这些问题的动机,但我不认为将unless之类的东西归结为具体的经验法则是非常明智的。这和Perl中的许多辅助语法一样,为程序员提供了一个小小的便利,可以帮助他们根据自己的判断更清楚地表达自己;在“Programming Perl”中,我看到的主要开发人员在很多方面都说了很多。没有更高的目的或合理化。我很清楚这个问题,但我使用它的唯一限制是看到它有助于使代码更清晰的更广泛的目的。如果确实如此,那么一切都很顺利。认识到代码是否可理解本身是直观的,并且不能简化为大量过于普遍的使用条件,涉及内置修饰符/运算符/整体语法的每个细微差别,以及大型组项目中需要约束和指导的地方我认为将这种毛发精细分割是不合理的。

答案 5 :(得分:1)

我的意见是永远不要使用除非。我的理由是:

  • 我认为语法使代码更难阅读。使用if的单一方法可以使事情更简单,更一致。
  • 如果您稍后需要添加else语句,则应该真正更改除非if。如果已经是if,那就更容易了。
  • 如果在except语句中的逻辑变得更复杂,那么你最终可能会得到奇怪的代码,比如“除非(x == 5&amp;&amp; y!= 7)。这很奇怪,因为它有一个双重否定第二次检查。
  • 还有其他方法可以否定事物,即x!= 5
  • 它与其他语言更加一致。我不知道有任何其他语言有一个除非声明,我认为有一个很好的理由。

在perl中,有4种方法可以编写if语句,if,除非然后将检查放在行的末尾而不是start。我更喜欢一种与其他语言一致的单一一致方法。

价值0.02美元。

答案 6 :(得分:1)

...中肯

  

在Perl最佳实践中,建议永远不要使用,除非。亲身,   我认为这是疯狂的。

20多年以来,人们更倾向于使用Perl而不是其他任何替代方案(其中大部分都没有Perl提供的模板),我不仅同意“疯狂”的判决,我很惊讶(关心)听到这个“最佳实践”希望摆脱它。

尽管如此,我更倾向于为了清晰起见而编写代码,而不是Perl程序员采用的隐式混淆替代方法“只是因为他们可以”。 '除非'与'if'明确相反,因此是在'if'条件中嵌入否定的非常有用的替代方法,特别是如果条件包含多个运算符。即使后面跟着else / elsif,这个理由也适用。

答案 7 :(得分:0)

或许只是个人观点,但我喜欢使用,除非if条件以一个开始!

答案 8 :(得分:0)

if(!$ condition)的语法等同于unless($ condition),同样如果你交换了条件的NOT'。

我个人更喜欢只使用IF语句。为什么?因为它记忆力较小。如果你有100行代码,其中一半使用除()而另一半使用if(),你需要花费更多时间来调试它,而不是只使用if()语句。

你可以“掌握”这个问题,但是,如果这样做,那么两者之间的关系就会毫不费力。但它不只是关于if()与除非()。别忘了......

if($condition) {
    #passed-condition code
} else {
    #failed-condition code
}

......等同于......

unless(!$condition) {
    #passed-condition code
} else {
    #failed-condition code
}

但if(){...} elsif(){...}呢?除非(){...} elsunless(){...},你将如何将其等同于?逻辑越复杂,在if()和unless()之间变得越困难。记忆越少,记忆越平衡,调试自己的代码就越快。