Como posso transformar algumas carpas específicas em croaks em Perl?
Pergunta
Eu tentei pegar um aviso de carpa:
carp "$start is > $end" if (warnings::enabled()); )
com Eval {} Mas não funcionou, então eu olhei no eval
documentação e eu descobrimos, que eval
captura apenas erros de sintaxe, erros de tempo de execução ou estaturas executadas.
Como eu poderia pegar um aviso de carpa?
#!/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";
Solução
Com base em seus comentários, meu entendimento é que você gostaria de fazer carp
em um aviso fatal.
Se for aceitável fazer tudo carp
Avisos em seu pacote de destino em erros fatais, você pode ser um ator de macaco carp
.
Pacote de cargo:
package Foo;
use Carp;
sub annoying_sub {
carp "Whine whine whine";
}
Programa principal:
use Foo;
*Foo::carp = \&Foo::croak;
Foo::annoying_sub();
Se você deseja limitar o patch de macaco a um escopo dinâmico, você pode usar local
:
use Foo;
Foo::annoying_sub(); # non-fatal
{ local *Foo::carp = \&Foo::croak;
Foo::annoying_sub(); # Fatal
}
Outras dicas
O CARP não morre, mas apenas imprime um aviso, então não há nada para pegar com avaliar ou o que for. Você pode, no entanto, substituir o manipulador de aviso localmente para impedir que o aviso seja enviado a 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!";
Resultado:
Oh noes! at foo.pl line 8
Wh00t! at foo.pl line 25
My new warning.
Arrgh! at foo.pl line 29
Em quase todos os casos, você deve preferir corrigir a causa da carpa.