どのように私はPerlでcroaksにいくつかの特定のの鯉を変更できますか?
質問
私は鯉-警告をキャッチしようとします:
carp "$start is > $end" if (warnings::enabled()); )
はeval {} を持つが、私はに見えたので、それは、仕事しませんでしたeval
のドキュメントでは、と私は、そのeval
キャッチのみ構文エラー、実行時、エラーや実行ダイ文を発見します。
どのように私は鯉の警告をキャッチするだろうか?
#!/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";
解決
あなたのコメントに基づいて、私の理解は、あなたが致命的な警告にcarp
を作りたいということです。
それは致命的なエラーにあなたのターゲットパッケージ内のすべてのcarp
の警告を行うことが許容される場合のことができます。サルのパッチcarp
ます。
Carpingパッケージ:
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のか、何とキャッチには何もありません。ただし、標準エラー出力に送られてから警告を防ぐために、ローカルハンドラを警告上書きすることができます:
#!/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
には、ほとんどの場合は、あなたの代わりに鯉の原因を固定好む必要があります。
所属していません StackOverflow