2009-10-20 15 views
8

私は間違った警告のドキュメントを理解する必要があります。私はそれを読むようにして、このコード:私は致命的であるために、すべての警告を求めてきましたので、warnings ::警告と致命的なPerlのカテゴリ

use warnings; 
use warnings FATAL => 'all'; 
warnings::warn('numeric', 'blarg'); 
print "finished\n"; 

は「blarg」警告を出力して死ぬべきです。しかし、私がコードを実行すると、私は得る:

$> /opt/local/bin/perl x.pl 
blarg at x.pl line 3 
finished 

なぜ私は死ぬことを警告することができない理解することができますか?

+0

私には*エラー*のような致命的な音がするほど重大な警告です。これは違いです、警告*は致命的ではありません。 – pavium

+4

@pavium:区別はありますが、警告プラグマのFATALオプションは、警告をエラーにするためのものです。 – ysth

答えて

12

大丈夫です。これは醜いです。私はポスト半分はwarningsのバグとして説明し、その後、それは実際には悪い微妙な方法でwarningsが動作していないことを認識した。

警告は、warnings::warn発信者の発信元からの警告ビットを取得するために、関連するスタックフレームを探し始めます。考えられるのは、モジュールを作成していて、関数内にwarnings::warnまたはwarnings::warnifを使用し、警告が出力されるかどうか(致命的かどうか)はを使用するコードの範囲内のuse warningsの設定に依存します。 caller(2)の代わりにcaller(1)で始まるオプションは提供されていないので、あなたが望む効果は得られません。

作業を行い(このインターフェイスは、それを書いた誰によって使用されることが期待された方法を示しています)コードの例:

package Foo; 
require warnings; 

sub bail { 
    warnings::warnif('numeric', "You fool! You divided by zero!"); 
} 

package main; 
use warnings FATAL => all; 

Foo::bail(); 
print "Will never be reached\n"; 

そして、あなたはちょうど別のレベルを追加することで、それが動作する方法を打ち負かすことはできませんサブルーチンの最初の呼び出し元から異なるパッケージの呼び出し元からwarn/warnif/enable /などのフラグを受け取るためです。

+0

あなたはそれを無意味なサブで包むことができます。 'サブbail {警告を使う} FATAL => all; sub {warnings :: warn( '危険')} - >()} ' –

+1

@hobbs:あなたはそれを持っています。 warningsパッケージ内のsubsは、ある種のsuper warn()のようなものではなく、モジュール開発者を対象としています。 – ysth

+0

これはバグではありません。あなたが言う悪の微妙なものです。です。説明ありがとう。 – lexu