更改qq(参数“%s”在%s行%d的排序中不是数字。“消息)

时间:2011-02-03 20:58:42

标签: perl warnings

如何更改排序函数在数字排序期间找到非数字值时抛出的Perl警告消息?

$ 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.

我希望能够让代码打印出来:

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

3 个答案:

答案 0 :(得分:4)

不考虑这是否是个好主意,您可以使用__WARN__信号处理程序来切断堆栈跟踪信息。

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

答案 1 :(得分: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;
}

Pragma是词法范围的,包括它们的反转。因此no warnings语句将持续到其封闭块的末尾。 (正如评论中指出的那样,您也可以仅禁用相关警告!)

答案 2 :(得分:1)

在使用&lt; =&gt;之前,您可能应该确保参数是数字的。运算符,需要数字。如果您只想对任何内容进行排序,可以使用cmp运算符。