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 はそれらを必要とするのでしょうか?