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";
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top