Как я могу поменять карпа на Perl?
Я пытался поймать карпа-предупреждение:
carp "$start is > $end" if (warnings::enabled()); )
с eval {}, но это не сработало, поэтому я посмотрел в eval
документация и я обнаружил, что eval
ловит только синтаксические ошибки, ошибки времени выполнения или выполненные операторы die.
Как я могу поймать предупреждение карпа?
#!/usr/bin/env perl
use warnings;
use strict;
use 5.012;
use List::Util qw(max min);
use Number::Range;
my @array;
my $max = 20;
print "Input (max $max): ";
my $in = <>;
$in =~ s/\s+//g;
$in =~ s/(?<=\d)-/../g;
eval {
my $range = new Number::Range( $in );
@array = sort { $a <=> $b } $range->range;
};
if ( $@ =~ /\d+ is > \d+/ ) { die $@ }; # catch the carp-warning doesn't work
die "Input greater than $max not allowed $!" if defined $max and max( @array ) > $max;
die "Input '0' or less not allowed $!" if min( @array ) < 1;
say "@array";
2 ответа
Исходя из ваших комментариев, я понимаю, что вы хотели бы сделать carp
в фатальное предупреждение.
Если это приемлемо сделать все carp
предупреждения в вашем целевом пакете о фатальных ошибках, которые вы можете обезьяна патч carp
,
Пакет для ковров:
package Foo;
use Carp;
sub annoying_sub {
carp "Whine whine whine";
}
Основная программа:
use Foo;
*Foo::carp = \&Foo::croak;
Foo::annoying_sub();
Если вы хотите ограничить патч обезьяны динамической областью действия, вы можете использовать local
:
use Foo;
Foo::annoying_sub(); # non-fatal
{ local *Foo::carp = \&Foo::croak;
Foo::annoying_sub(); # Fatal
}
Карп не умирает, а просто выводит предупреждение, так что нечего ловить с помощью eval или чего-то еще. Однако вы можете перезаписать обработчик предупреждений локально, чтобы предотвратить отправку предупреждения в stderr:
#!/usr/bin/env perl
use warnings;
use strict;
use Carp;
carp "Oh noes!";
{
local $SIG{__WARN__} = sub {
my ($warning) = @_;
# Replace some warnings:
if($warning =~ /replaceme/) {
print STDERR "My new warning.\n";
}
else {
print STDERR $warning;
}
# Or do nothing to silence the warning.
};
carp "Wh00t!";
carp "replaceme";
}
carp "Arrgh!";
Выход:
Oh noes! at foo.pl line 8
Wh00t! at foo.pl line 25
My new warning.
Arrgh! at foo.pl line 29
Почти во всех случаях вы должны вместо этого установить причину карпа.