为什么Perl中的'last'被称为'last'?

时间:2009-11-29 02:26:52

标签: perl syntax language-features language-design

在Perl而不是last中调用break的历史原因是什么?在C中调用它?

Perl的设计受C的影响(除了awk,sed和sh - 请参阅下面的man page),因此必须有一些推理背后不能使用熟悉的C-style命名break / last。 / p>

Perl 1.000(1987年12月18日发布)手册的一些历史:

  

[Perl]结合(在作者看来,无论如何)C,sed,awk和sh的一些最佳功能,所以熟悉这些语言的人应该没有什么困难。 (语言历史学家也会注意到一些csh,Pascal,甚至是BASIC | PLUS的痕迹。)

6 个答案:

答案 0 :(得分:33)

  

'break'或'last'的语义是   由语言定义(在这种情况下   Perl),而不是你。

     

为什么不把'last'想象成“这是   要运行的最后一个语句   循环”。

     

总是让我感到奇怪的是   'C'中的'continue'语句启动了   下一轮循环。这是   绝对是一个奇怪的用途   “继续”的概念。但它是   'C'的语义,所以我接受它。

     

试图映射特定的   将概念编程为单一   有现有意义的英语单词   总会出现某种情况   不匹配的奇怪性

Source

另外,拉里沃尔有点奇怪。你见过他的照片吗?

Larry Wall
(来源:wired.com

答案 1 :(得分:17)

我希望这是因为Perl是由语言学家而不是计算机科学家创建的。在正常的英语用法中,声明你已完成最后一遍循环的概念与单词“last”(“这是 last pass”)的关联性强于单词“打破“(”打破循环“?”打破退出循环“? - 它甚至不清楚”破坏“是如何与退出循环相关的)。

答案 2 :(得分:14)

当你记得你可以使用它而不仅仅是直接循环控制时,术语'last'更有意义。您可以将其应用于上面一个或多个级别的标记块 它所在的区块:

 LINE: while( <> ) {
      WORD: foreach ( split ) {
           last LINE if /^__END__\z/;
           ...
           }
      }

当你把它读成“最后一行,如果它匹配......”时,用英语说“最后”会更自然地读出来。

答案 3 :(得分:10)

Theres是您可能需要考虑的另一个原因:

最后不仅仅是循环控制。

sub hello {
  my ( $arg ) = @_; 

  scope: { 
      foo(); 
      bar(); 
      last if $arg > 4; 
      baz(); 
      quux(); 
  }
}

最后,因为这是一般的流量控制机制,不限于循环。当然,你可以将上面的内容概括为一个最多运行1次的循环,对我来说没有循环表示“Break?我们有什么突破?”

相反,我认为“last”为“跳转到 last 大括号”的位置,这是为了这个目的,在语义上更明智。

答案 4 :(得分:6)

我向Damian Conway提出了同样的问题say。 Perl 6将引入say,这不过是自动添加换行符的print。我的问题是为什么不简单地使用echo,因为这是echo在Bash(以及可能在其他地方)所做的事情。

他的回答是: echosay长33%。

他有一点意见。 :)

答案 5 :(得分:5)

因为它进入循环的最后一个。而且因为拉里沃尔是个怪人。