¿Cómo puedo cambiar algunas carpas específicas en croaks en Perl?
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";
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.