Perlで「last」が「last」と呼ばれるのはなぜですか?
-
06-07-2019 - |
質問
last
がCで呼び出される break
ではなく、Perlで呼び出されるという歴史的な理由は何ですか?
Perlの設計はC(awk、sed、shに加えて-下記のmanページを参照)の影響を受けたため、おなじみのCスタイルのbreak / lastの命名を行わない理由がいくつかあるに違いありません。
Perl 1.000(1987年12月18日リリース)のmanページの歴史:
[Perl]は(とにかく著者の意見では)C、sed、awk、shのいくつかの最高の機能を組み合わせているので、これらの言語に精通している人はそれほど難しくないはずです。 (言語史家は、csh、Pascal、さらにはBASIC | PLUSの痕跡にも気付くでしょう。)
解決
「break」または「last」のセマンティクスは 言語によって定義されます(この場合 Perl)、あなたではない。
「最後」を"と考えないのはなぜですか のために実行する最後のステートメント ループ"。
それはいつも奇妙だと思った 「C」の「continue」ステートメントは、 ループの次のパス。これは 間違いなく奇妙な使い方 「続行」の概念。しかし、それは 「C」のセマンティクスなので、私はそれを受け入れます。
特定のマッピングを試みることにより プログラミングの概念を単一に 既存の意味を持つ英語の単語 常に何らかの種類があります 不一致の奇妙さ
さらに、ラリーウォールはちょっと変です。彼の写真を見ましたか?
(ソース: wired.com )
他のヒント
これは、Perlがコンピューター科学者ではなく、言語学者によって作成されたためだと思います。通常の英語の使用法では、ループの最終パスを完了したことを宣言するという概念は、「最後」という単語とより強く結びついています。 ("これは最後のパスです")という言葉よりも" break" (" break the loop&quot ;?" break out of the loop&quot ;?-" break"がループの終了とどのように関係するかは明確ではありません) 。
「last」という用語は、即時のループ制御以外にも使用できることを思い出すと、より意味があります。上記の1つ以上のレベルのラベル付きブロックに適用できます 含まれているブロック:
LINE: while( <> ) {
WORD: foreach ( split ) {
last LINE if /^__END__\z/;
...
}
}
「最後」と言うと、より自然に読みます。英語で、「最後の行が一致する場合は...」と読むと、
考慮する必要がある追加の理由があります:
最後は単なるループ制御ではありません。
sub hello {
my ( $arg ) = @_;
scope: {
foo();
bar();
last if $arg > 4;
baz();
quux();
}
}
それ自体は、ループに限定されない一般的なフロー制御メカニズムです。もちろん、上記を1回まで実行するループとして一般化できますが、ループが存在しないということは&quot; Break?私たちは何から抜け出しますか?&quot;
代わりに、&quot; last
&quot; &quot; 最後の ブレースの位置にジャンプします。これは、この目的のために、より意味的に賢明です。
say
についてDamian Conwayに同じ質問をしていました。 Perl 6は say
を導入します。これは、自動的に改行を追加する print
にすぎません。私の質問は、なぜ echo
を使用しないのかということです。これは、Bash(およびおそらく他の場所)で echo
が行うことだからです。
彼の答えは: echo
は say
より33%長いです。
彼はそこにポイントを持っています。 :)
ループの最後に移動するため。ラリーウォールは変な男だったからです。