在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的痕迹。)
答案 0 :(得分:33)
'break'或'last'的语义是 由语言定义(在这种情况下 Perl),而不是你。
为什么不把'last'想象成“这是 要运行的最后一个语句 循环”。
总是让我感到奇怪的是 'C'中的'continue'语句启动了 下一轮循环。这是 绝对是一个奇怪的用途 “继续”的概念。但它是 'C'的语义,所以我接受它。
试图映射特定的 将概念编程为单一 有现有意义的英语单词 总会出现某种情况 不匹配的奇怪性
另外,拉里沃尔有点奇怪。你见过他的照片吗?
(来源: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(以及可能在其他地方)所做的事情。
他的回答是: echo
比say
长33%。
他有一点意见。 :)
答案 5 :(得分:5)
因为它进入循环的最后一个。而且因为拉里沃尔是个怪人。