1

print STDERRコードベース内の既存のステートメントを置き換えたい。

どうやら、目にはあまり合わないようですが、それは私だけですか。ハンドラーwarnによってキャッチされることを知って使用する必要があります。$SIG{_WARN_}または、より良いオプションがあります。はいの場合、なぜこれらのオプションを使用せずに使用するのですかprint STDERR

4

2 に答える 2

2

の利点print STDERRは、何が起こるかをすぐに確認できることです。つまり、何かを STDERR に出力します。これは、デバッグ メッセージか何かである可能性があります。

warn関数はわずかに異なります。

  1. 警告ハンドラーをトリガーし、
  2. 改行で終わらない場合は、行番号が追加されます。

おそらくこれは、データのログ記録ではなく、警告に使用する必要があります

Carp関数ファミリーにも興味があるかもしれません。carpのようwarnに動作しますが、呼び出し元からの行番号/ファイルを報告します。スタックトレースを使用しますcluckwarn

しかし、あなたが自分自身を転がすことを妨げるものは何もありません。機能的に同等のサブは次のようにprint STDERRなります。

sub debug { print STDERR @_ }

s/print STDERR/debug/gその1回の出現を除いて、文字通りあなたの情報源を得ることができます。debugまた、引数の周りのかっこを省略できるようにする場合は、使用する前にその関数を宣言またはインポートする必要があります。

debug "this ", "is ", "DATA";

考慮すべき点: サブルーチンの呼び出しは遅いprintですが、組み込みのオペコードです。美しさとパフォーマンスを交換することも、その逆も可能です。

于 2013-03-02T06:31:53.167 に答える
1

debugラップするサブルーチンを作成すると、単純なorステートメントが提供するprint STDERR以上の柔軟性が得られます。たとえば、デバッグ メッセージをオフにしたり、メッセージを別の宛先にリダイレクトしたりできます。たとえば、頭のてっぺんから:printwarn

sub debug {
  my ($msg, %param) = @_;

  $param{level} //= 1; # default if no level specified
  return if $param{level} < $config{log_level};

  given ($param{dest}) {
    when ('mail') { send_email_to_admin(subject => "Application Error!", body => $msg) }
    when ('log') { write_to_logfile($msg) }
    default { print STDERR $msg }
  }
}

debug('foo');   # goes to STDERR by default
$config{log_level} = 2;
debug('bar');  # message is ignored as unimportant at current logging level
debug('bar', level => 3, dest => mail); # still important; gets emailed to admin
于 2013-03-02T11:11:24.223 に答える