Perl循环标签是否算作GOTO?

Kav*_*rek 18 perl loops goto flow-control

通常,避免使用GOTO是一种好习惯.牢记这一点,我一直在与同事讨论这个话题.

请考虑以下代码:

Line:
    while( <> ) {
        next Line if (insert logic);
    }
Run Code Online (Sandbox Code Playgroud)

使用循环标签计算为goto吗?

以下是perldoc中的perlsyn所说的:

以下是C程序员如何在Perl中编写特定算法的代码:

for (my $i = 0; $i < @ary1; $i++) {
    for (my $j = 0; $j < @ary2; $j++) {
        if ($ary1[$i] > $ary2[$j]) {
            last; # can't go to outer :-(
        }
        $ary1[$i] += $ary2[$j];
    }
    # this is where that last takes me
}
Run Code Online (Sandbox Code Playgroud)

而这里的Perl程序员如何更熟悉这个成语可能会这样做:

OUTER: for my $wid (@ary1) {
    INNER:   for my $jet (@ary2) {
                 next OUTER if $wid > $jet;
                 $wid += $jet;
             }
       }
Run Code Online (Sandbox Code Playgroud)

我对此的看法并不是因为你明确地告诉了一个短路和推进的循环然而我的同事不同意,说它只是一个花哨的GOTO,应该避免.我正在寻找一个引人注目的论点或文档,解释为什么这是或不是GOTO.我也会接受一个解释,为什么这个在perl中被认为是好的做法.

kas*_*rjj 29

Dijkstras的意图绝不是任何类似goto的东西都被认为是有害的.这是代码的结构,其中gotos被用作几乎任何类型的程序流程更改的主要构造将导致我们今天称为意大利面条代码.

您应该阅读原始文章,并记住它是在1968年编写的,当标记跳转是几乎所有编程语言中的主要流控制构造.

http://userweb.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF

  • +1,自从他做出以来,该引用已被脱离背景.这是结构化编程的一个论据(aka:if,else,for,while),而不是使用goto来处理所有事情. (7认同)

Mik*_*keD 16

GOTO标签的危险在于它们会创建意大利面条代码并使逻辑不可读.在这种情况下,这些都不会发生.使用GOTO语句有很多有效性,大部分辩护来自Donald Knuth [ 文章 ].

深入研究C和Perl示例之间的差异......如果您考虑使用C程序在汇编级别上发生的事情,那么无论如何都会编译为GOTO.如果您已经完成了任何MIPS或其他汇编编程,那么您已经看到大多数这些语言没有任何循环结构,只有条件和无条件分支.

最后,它归结为可读性和可理解性.通过保持一致,这两者都得到了巨大的帮助.如果您的公司有风格指南,请遵循这一点,否则遵循perl风格指南听起来对我来说是一个好主意.这样,当其他perl开发人员将来加入您的团队时,他们将能够开始运行并熟悉您的代码库.


zvr*_*rba 5

只要它使代码更容易理解,谁在乎它是否算作goto?使用goto通常比if()和循环条件中的一堆额外测试更具可读性.

  • @Downvoters:为什么这个被投票?他只是说GOTO有它的位置,可以正确使用,是一件好事.只是说GOTO是邪恶的,因为它被称为GOTO是愚蠢的. (5认同)