2017-08-05 8 views
2

頻繁に呼び出される古いPerlコードがたくさんあります。新しいモジュールを書いていて、 Apacheのerror_logには、現在使用されているすべてのモジュールの警告が表示されます。例えば、コードベースのすべてのファイルに「警告」や-wを付けずにPerlの警告文が出力される

"my" variable $variable masks earlier declaration in same statement at 
    /path/to/module.pm line 40 (#1) 

Useless use of hash element in void context at 
    /path/to/another/module.pm line 212 (#2) 

主なレイアウトは、モジュールが含まれており、ウェブサイトの特定のページを作成するために必要とメインスクリプトは、その後、メニューのような静的な要素を処理し、それらに要求を指示し1つの巨大なスクリプトです。

私の現在のプロジェクトはこのメインスクリプトから分離されていますが、私は自分のコードをajaxで呼び出すときはいつでも、メインスクリプトを使用するいくつかの他のajax呼び出しがあります。私のプロジェクトに電話をしているときにのみ要求されます。

私はすべてのモジュールをグロップしていて、それらの中には使用警告(または-w)がありません。また、メインスクリプトと私自身のプロジェクトで警告なしの「すべて」を使用しようとしましたが、

この時点で私は次に何をすべきかというアイデアがなくなるので、すべての助けに感謝します。警告を抑制したいのですが、コードベースはかなり古いものであり、最初の警告はできません。

Apacheサーバーでもmod_perlが実行されていますが、それが違いを生む可能性がある場合は、CGIと何か関係があるかもしれませんが、証拠を見つけることはできません。

答えて

2

コードは、特定の最上位レベルのPerlスクリプトを実行することによって呼び出されます。同様に、モジュールに影響するよう

そしてプレース

BEGIN { $SIG{__WARN__} = sub {} }; 

警告の印刷を停止するものスクリプト(S)にuse文の前に、このBEGINブロックを__WARN__フックを使用します。

__WARN__'IGNORE'をサポートしていないので、空のサブルーチンは警告をミュートする方法です。

warnおよび%SIG in perlvarを参照してください。 コメントといくつかの例については、this postthis postを参照してください。


あなたはそれが完全なスタックトレースを印刷するようになりますと、微調整何をすることができCarp

BEGIN { 
    $SIG{__WARN__} = \&Carp::cluck; # or Carp::confess; to also die 
} 

を使用することができ、さらに調査と警告を追跡します。または、Carp::Alwaysを使用します。可能であれば

あなたは警告を抑制するために、より正確なレベルを見つけたらlocal $SIG{__WARN__}その後、(CORE::GLOBAL::warnをオーバーライドするなど)いくつかのより抜本的な対策

ためthis post を参照してくださいには、移動するための方法です。これは上記のリンク先の投稿で使用されています。ここにはanother exampleがあります。もちろん、あらゆる場所ではなく必要な場所でのみ警告を抑制する方がはるかに優れています。

もっと詳しく

longmessはもはやそれほど標準と同様にサポートされることに注意してください。

+0

メインファイルに実装したときにうまくいきませんでしたが、 プロジェクトに実装した時点で問題なく動作していますが、これを解決してマークするとうまくいけばここに。乾杯。 – Fashim

+0

私はプロジェクトの構造を理解していないので、 "メインプログラムの中で"声明をリラックスしようとしていました。帰属ありがとうございます。 – zdim

+0

@Fashim Updated、これは私が言ったことです。私はそれが良いと思います。それを追跡するために警告を「die」(リンクされたポストの1つを参照)に変更し、完全なスタックトレースを出力することができます。私はその投稿にコメントを追加します。 – zdim

関連する問題