Изменение qq (аргумент "% s" не является числовым в сортировке в строке% s строки% d. ") - PullRequest
3 голосов
/ 03 февраля 2011

Как я могу изменить предупреждающее сообщение 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 ]

4 голосов
/ 04 февраля 2011

Не вдаваясь в то, что это хорошая идея или нет, вы можете использовать обработчик сигналов __WARN__, чтобы отрубить информацию трассировки стека.

local $SIG{__WARN__} = sub { 
    my $msg = pop(@_); 
    $msg =~ s/ at \S+ line \d+//;
    print STDERR @_, $msg
};
my @slist = sort { $a <=> $b } @ulist;
2 голосов
/ 04 февраля 2011

Вы можете заменить предупреждающую прагму:

#!/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 будет длиться до конца включающего его блока. (И как было отмечено в комментариях, вы можете отключить только соответствующее предупреждение!)

1 голос
/ 04 февраля 2011

Возможно, вы должны убедиться, что аргументы числовые, прежде чем использовать оператор <=>, для которого требуются числа. Если вы просто хотите что-то отсортировать, вы можете использовать оператор cmp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...