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