どのように私はPerlでcroaksにいくつかの特定のの鯉を変更できますか?

StackOverflow https://stackoverflow.com/questions/2817750

  •  26-09-2019
  •  | 
  •  

質問

私は鯉-警告をキャッチしようとします:

 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

には、ほとんどの場合は、あなたの代わりに鯉の原因を固定好む必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top