Ответ 1
Я думал, что покажу вам, как создать уникальную логику предупреждения. Однако я не рекомендую:
my %printed;
local $SIG{__WARN__} = sub {
my $message = shift;
my ( $msg, $loc ) = $message =~ m/(.*?) at (.*?line \d+)/;
print $message unless $printed{$loc}{$msg}++;
};
Я должен сказать, что я не рекомендую это как общую практику. Потому что лучше иметь предупреждение. Это либо операция, которая может принимать значение undefined, либо вы не хотите обрабатывать значение undef
. Я пытаюсь удалить все предупреждения из моего кода.
В первом случае размещение no warnings 'uninitialized';
в цикле for
намного проще и правильнее. Во втором случае вы, вероятно, захотите потерпеть неудачу.
Однако, если это то, что вы действительно хотели бы обрабатывать, но предупреждали об этом, скажите, что вам нужна надежная обработка данных, но вы хотели бы предупредить восходящие процессы, что у вас есть плохие данные, вы могли бы приступить к созданию sub warn_once
:
{ use Carp ();
my %warned;
sub warn_once {
my $message = shift;
my ( $msg, $loc ) = $message =~ m/(.*?) at (.*?line \d+)/;
Carp::carp( $message ) unless $warned{$loc}{$msg}++;
};
}
И назовите его следующим образом:
while ( <> ) {
warn_once( '$uninitialisedValue is uninitialized' )
unless defined( $uninitialisedValue)
;
no warnings 'uninitialized';
print ${$uninitialisedValue}{$_},"\n";
}
Тогда вы что-то решили.