違いは、(Perl とプログラムの観点から)独立した 2 つの別個のファイル ハンドルに書き込むことです。
最初のものは、Unixy OS の特別な「デバイス」ファイルに開かれたファイル ハンドルです。これは、「プロセスの制御端末のシノニムです」 (この Linux ドキュメントからの引用)。これは一般的に「スクリーン」と考えられていますが、必ずしもそうである必要はありません (たとえば、ターミナルは代わりにシリアル ポートのデバイス ファイルにリンクすることができます)。存在しないか、開くことができない可能性があります。
2 つ目は、プロセスのファイル記述子 #1 にデフォルトで関連付けられたファイル処理です。
典型的な状況では、Unix シェルはデフォルトでファイル記述子 #1 (したがって、リダイレクトなしで起動するすべてのプロセスの 1 つ) を/dev/tty
.
この 2 つは Perl の観点からは何の共通点もありませんが、 Unix シェルの動作方法により、これら 2 つがデフォルトで関連付けられるという事実以外にはありません。
引用された 2 つのコード部分の機能的動作は、このデフォルトにより同一のように見えることがよくありますが、それは単なる「偶然」です。
実際の違いの中で:
-t
operatorを使用して、STDOUT が tty に接続されているかどうかを確認できます。
if ( -t STDOUT ) { say 'STDOUT is connected to a tty' }
余談ですが/dev/tty
、STDOUT ファイルハンドルを明示的に閉じて、再度開いて を指すようにすることで、STDOUT が に書き込むことができることに注意して/dev/tty
ください。
close STDOUT or die $!;
open STDOUT '>:encoding(utf8)', '/dev/tty' or die $!;