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

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的痕迹。)

有帮助吗?

解决方案

  

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

     

为什么不将'last'视为“这是”   要运行的最后一个语句   环路QUOT;

     

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

     

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

来源

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


(来源: wired.com

其他提示

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

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

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

更自然地说“最后”当你把它读成“最后一行,如果它匹配......”时,用英文写的。

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

最后不仅仅是循环控制。

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

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

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

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

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

他的回答是: echo 长33%。

他有一点意见。 :)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top