Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/function/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 更改qq(参数“%s”在%s行%d处排序时不是数字)_Perl_Warnings - Fatal编程技术网

Perl 更改qq(参数“%s”在%s行%d处排序时不是数字)

Perl 更改qq(参数“%s”在%s行%d处排序时不是数字),perl,warnings,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. 不必讨论这是否是一个好主意,您可以使用\uuuu WA

如何更改排序函数在数值排序过程中发现非数值时抛出的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.

不必讨论这是否是一个好主意,您可以使用
\uuuu WARN\uuuu
信号处理程序来切掉堆栈跟踪信息

local $SIG{__WARN__} = sub { 
    my $msg = pop(@_); 
    $msg =~ s/ at \S+ line \d+//;
    print STDERR @_, $msg
};
my @slist = sort { $a <=> $b } @ulist;
local$SIG{{uuuuu WARN}=sub{
我的$msg=pop(@;);
$msg=~s/at\s+line\d+/;
打印标准@uu,$msg
};
my@slist=sort{$a$b}@ulist;

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

您可以取消警告杂注:

#!/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;
}
#/usr/bin/perl
严格使用;
使用警告;
my@ulist=qw(1 2 5x 4 3);
我的@slist;
{
没有“数字”警告;
@slist=sort{$a$b}@ulist;
}

杂注是词汇范围的,包括它们的倒数。因此,
no warnings
语句将持续到其封闭块的末尾。(正如评论中所指出的,您也可以禁用相关警告!)

为什么希望它打印更少的信息?Vlad H:…以匹配应用程序其余部分的错误消息标准。比这更简单的是在消息中添加换行符,但警告消息来自Perl,而不是用户消息。行号信息在到达
$SIG{{uuuuuu WARN\uuuuuu}
时已经是消息的一部分。或者更好的是,您可以只关闭不需要的警告(在本例中):没有“数字”警告;好电话。我已经忘记了存在特定警告的事实。您可以将它放在排序块本身中:
@slist=sort{no warnings“numeric”;$a$b}@ulist,明白了;但是暴民们解决了这个问题,因为我不想压制这些警告。我希望警告文本符合为我们的产品定义的格式。考虑到这一点,但对于这个应用程序,当非数值经过时发出警告是完美的,让sort()自然运行,这在绝大多数情况下都会产生正确的答案。
#!/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;
}