Pregunta

Traté de coger una carpa de alerta:

 carp "$start is > $end" if (warnings::enabled()); ) 

eval {} pero no funcionó, así que busqué en la documentación eval y descubrí, que sólo capturas eval sintaxis, errores de tiempo de ejecución errores u-die-instrucciones ejecutadas.

¿Cómo podría coger una advertencia de la 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";
¿Fue útil?

Solución

Sobre la base de sus comentarios, mi entendimiento es que le gustaría hacer una advertencia en carp fatal.

Si es aceptable para hacer todas las advertencias carp en su paquete de destino en errores fatales que pueda mono-parche carp.

Carping paquete:

package Foo;
use Carp;

sub annoying_sub {
    carp "Whine whine whine";
}

programa principal:

use Foo;

*Foo::carp = \&Foo::croak;

Foo::annoying_sub();

Si desea limitar el parche mono a un alcance dinámico, puede utilizar local:

use Foo;

Foo::annoying_sub();  # non-fatal

{   local *Foo::carp = \&Foo::croak;
    Foo::annoying_sub();  # Fatal
}

Otros consejos

carpa no muere, pero sólo imprime una advertencia, por lo que no hay nada que captura con eval o lo que sea. Puede, sin embargo, sobrescribir el controlador advierten localmente para evitar la advertencia de ser 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!";

Salida:

Oh noes! at foo.pl line 8
Wh00t! at foo.pl line 25
My new warning.
Arrgh! at foo.pl line 29

En casi todos los casos se debe preferir la fijación de la causa de la carpa en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top