Sinanが私が推奨する答えをすでに持っているので、私はこれに答えるつもりはありませんでしたが、今夜私はまた、次の中間Perlの「ファイルハンドル参照」の章に取り組んでいました。それは私があなたの質問にそれらを適応させることなく直接コピーするいくつかの関連する段落です:
IO::NullおよびIO::Interactive
出力をどこにも送信したくない場合もありますが、どこかに送信する必要があります。その場合、IO :: Nullを使用して、与えたものをすべて破棄するファイルハンドルを作成できます。見た目も動作もファイルハンドルと同じですが、何もしません。
use IO::Null;
my $null_fh = IO::Null->new;
some_printing_thing( $null_fh, @args );
また、出力が必要な場合もありますが、そうでない場合もあります。ログインしてターミナルでプログラムを実行している場合は、多くの出力を確認したいと思うでしょう。ただし、 cronを使用してジョブをスケジュールする場合、ジョブを実行する限り、出力についてはあまり気にしないでしょう。IO :: Interactiveモジュールは、違いを伝えるのに十分スマートです。
use IO::Interactive;
print { is_interactive } 'Bamboo car frame';
サブルーチンはis_interactive
ファイルハンドルを返します。サブルーチンの呼び出しは単純なスカラー変数ではないため、中括弧で囲んで、Perlにファイルハンドルであることを通知します。
「何もしない」ファイルハンドルについて理解したので、誰もが書きがちな醜いコードを置き換えることができます。出力が必要な場合とそうでない場合があります。そのため、多くの人は、条件付きの事後式を使用して、ステートメントをオフにする場合があります。
print STDOUT "Hey, the radio's not working!" if $Debug;
$debug_fh
その代わりに、必要な条件に基づいて異なる値を割り当てif $Debug
、すべての最後に醜いものを省くことができますprint
:
use IO::Null;
my $debug_fh = $Debug ? *STDOUT : IO::Null->new;
$debug_fh->print( "Hey, the radio's not working!" );
IO :: Nullの背後にある魔法は、「未開封のファイルハンドルGLOBでのprint()」について、間接的なオブジェクト表記(たとえば
print $debug_fh
)で警告を発する場合がありますが、正常に機能します。直接フォームではその警告は表示されません。