2011-02-03 14 views
2

ソート関数が発生したときに数値以外の値を検出した場合に発生するPerl警告メッセージを変更するにはどうすればよいですか?数値ソートqqの変更(引数 "%s"は%s行%dのソートの数値ではありません)

$ cat t.pl 
#!/usr/bin/perl 
use strict; 
use warnings; 
my @ulist = qw(1 2 5x 4 3); 
my @slist = sort { $a <=> $b } @ulist; 

$ t.pl 
Argument "5x" isn't numeric in sort at ./t.pl line 5. 

私が代わりにこのコードの印刷を行うことができるようにしたいのですが?あなたは__WARN__信号を使用することができ、これは良いアイデアであるかどうかに得ることなく

$ t.pl 
./t.pl: Argument "5x" isn't numeric in sort. 
+5

なぜ情報を印刷しないのですか? –

+0

Vlad H:...残りのアプリケーションのエラーメッセージの標準と一致させる。 –

答えて

4

スタックトレース情報を切り落とすハンドラ

local $SIG{__WARN__} = sub { 
    my $msg = pop(@_); 
    $msg =~ s/ at \S+ line \d+//; 
    print STDERR @_, $msg 
}; 
my @slist = sort { $a <=> $b } @ulist; 
+0

これは、メッセージに改行を追加することで簡単に行情報が追加されないようにすることです。 – Ether

+1

しかし、警告メッセージはPerlからであり、ユーザメッセージからではありません。行番号情報は '$ SIG {__ WARN __}'に到達するまでにすでにメッセージの一部です。 – mob

1

数値が必要な< =>演算子を使用する前に、引数が数値であることを確認する必要があります。並べ替えをしたいだけなら、cmp演算子を使うことができます。

+0

しかし、このアプリケーションでは、数値以外の値が移動し、sort()が自然に動作するよう警告するのは完璧です。圧倒的多数のケースで正しい答えが得られます。 –

2

あなたは、警告プラグマを打ち消すことができます:

#!/usr/bin/perl 
use strict; 
use warnings; 
my @ulist = qw(1 2 5x 4 3); 
my @slist; 
{ 
    no warnings 'numeric'; 
    @slist = sort { $a <=> $b } @ulist; 
} 

プラグマは、辞書的にそれらの反転を含め、スコープされています。したがって、no warningsステートメントは、その囲むブロックの終わりまで続くでしょう。 (また、コメントに指摘されているように、関連する警告だけを無効にすることもできます!)

+2

さらに、(この場合は)望ましくない警告だけをオフにすることもできます。 – Sean

+0

よろしくお願いします。私は特定の警告があったという事実を忘れてしまった。 –

+1

ソートブロック自体にいつでも置くことができます: '@slist = sort {no warnings" numeric "; $ a <=> $ b} @ulist; '。 – tchrist

関連する問題