14

perl の作成者が、ファイルハンドルへの出力に通常とは異なる構文を選択した理由が不思議です。

    print filehandle list

ファイルハンドルの後にコンマなし。「リストの印刷」と「ファイルハンドルのリストの印刷」を区別するためだと思いますが、2 つの関数を作成するよりもアドホック構文が優先されたのはなぜですか。

調べてみると、これは間接的なオブジェクト構文であるという説明に出くわしましたが、perl 4 以前には print 関数が存在しなかったのに対し、perl にオブジェクト指向機能が登場したのは比較的後だったのでしょうか? perl での print の歴史に詳しい人はいますか?

4

4 に答える 4

4

コンマはすでにリスト コンストラクタとして使用されているため、意味的に異なる引数を に区切るために使用することはできませんprint

open my $fh, ...;
print $fh, $foo, $bar

3 つの変数の値を出力しようとしているように見えます。コンパイル時に動作するパーサーが、$fh実行時にファイル ハンドルを参照することを伝える方法はありません。したがって、オプションのファイルハンドルと実際にそのファイルハンドルに出力する値を構文的に (意味的にではなく) 区別するには、別の文字が必要です。

この時点で、最初の引数と 2 番目の引数が空白で区切られていることをパーサーが認識するのは、他の文字で区切られている場合よりも難しくありません。

于 2013-09-13T22:06:05.153 に答える
3

Perl がprint関数のように見せるためにコンマを使用していた場合、 以外に出力するものを含めている場合は、常にファイルハンドルを含める必要があります$_。これが関数の動作です。2 番目のパラメーターを渡す場合は、最初のパラメーターも含める必要があります。2 番目のパラメーターが存在する場合、最初のパラメーターがオプションである Perl で考えられる関数は 1 つもありません。splitを見てください。0 ~ 4 個のパラメーターを使用して書き込むことができます。ただし、 a を指定する<limit>場合は、最初の 3 つのパラメーターも指定する必要があります。

他の言語を見ると、すべて2 つの異なる印刷方法が含まれています。1 つは STDOUT が必要な場合、もう 1 つは STDOUT 以外に印刷する場合です。したがって、Python には と の両方がprintありwriteます。C には と の両方がprintfありfprintfます。しかし、Perl はたった 1 つのステートメントでこれを行うことができます。

print ステートメントをもう少し詳しく見てみましょう - Perl が最初に書かれた 1987 年までさかのぼって考えてみましょう。

print構文は次のように考えることができます。

print <filehandle> <list_to_print>

に印刷するにOUTFILEは、次のように言います。

このファイルに出力するには、次のようにします。

print OUTFILE "This is being printed to myfile.txt\n";

構文はほとんど英語のようです (PRINT to OUTFILE the string "This is being print to myfile.txt\n"

STDOUT を使用して同じことを行うこともできます。

print STDOUT "This is being printed to your console";
print STDOUT " unless you redirected the output.\n";

ショートカットとして、ファイルハンドルが指定されていない場合、STDOUT または選択が設定されたファイルハンドルに出力されます。

print "This is being printed to your console";
print " unless you redirected the output.\n";

select OUTFILE;
print "This is being printed to whatever the filehandle OUTFILE is pointing to\n";

これで、この構文の背後にある考え方がわかります。

通常はコンソールに出力するプログラムがあるとします。ただし、上司は、STDOUT の代わりに、必要に応じてその出力の一部をさまざまなファイルに出力することを望んでいます。Perl では、いくつかの select ステートメントを簡単に追加でき、私の問題は解決されます。Python、Java、または C では、print ステートメントのそれぞれを変更する必要があり、 STDOUT へのファイル書き込みを使用するロジックが必要です (これには、ファイルを開いて STDOUT に複製する際のいくつかの設定が含まれる場合があります)。

Perl は本格的な言語として書かれたわけではないことを思い出してください。awk よりも簡単かつ柔軟に、テキスト ファイルを解析するという手っ取り早い作業を行うために作成されました。何年にもわたって、人々はその柔軟性のためにそれを使用し、古いものの上に新しい概念が追加されました. たとえば、Perl 5 より前は、参照のようなものはありませんでした。つまり、オブジェクト指向プログラミングのようなものはありませんでした。Perl 3 や Perl 4 の時代には、単純なlist, hash,scalar変数よりも複雑なものが必要な場合、自分でそれをいじる必要がありました。複雑なデータ構造が前代未聞だったわけではありません。C には最初から構造体がありました。なんてこった、パスカルでさえレコードのコンセプトを持っていたベルボトムがクールだと人々が思っていた1969年にさかのぼります。(私たちは正気でないことを認めます。私たちは皆薬物を使用していました。)しかし、Bourne シェルもawk複雑なデータ構造も持たないのに、なぜ Perl はそれらを必要とするのでしょうか?

于 2013-09-16T17:02:50.147 に答える
0

なぜだめですか?perl の DWIM 精神で、簡潔で機能します。

おそらく、ラリー・ウォールがそのように気に入ったからです。

于 2013-09-13T19:43:03.230 に答える