如何更改排序函数在数字排序期间找到非数字值时抛出的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.
答案 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运算符。