1

私はMarpa::R2を使用しており、 Try::Tinyを使用してエラーをキャッチしようとしています。try解析コードをブロックに入れると、valueメソッドの結果がundef. これが私のコードです:

use strict;
use warnings;
use Marpa::R2;
use Data::Dumper;
use Try::Tiny;

my $grammar = Marpa::R2::Scanless::G->new(
    {
        source => \(<<'END_OF_SOURCE'),
            :default ::= action => ::array
            :discard ~ ws
            ws ~ [\s]+
            :start ::= Name
            Name ::= Foo
            Foo ~ [\w]+
END_OF_SOURCE
    }
);
my $reader = Marpa::R2::Scanless::R->new(
    {
        grammar => $grammar,
    }
);
my $input = 'foo';
try{
    $reader->read(\$input);
}catch {
    warn "caught error: $_";
}
my $value = $reader->value;
print Dumper $value;

私は文法が何であるかを理解しようとして少し気が狂っていましたが、tryブロックを削除すると$reader->value非nullの値になることに気付きました。ブロック$value内で割り当てても、ブロックが終了すると次のようになります。tryundef

my $value;
try{
    $reader->read(\$input);
    $value = $reader->value;
}catch {
    warn "caught error: $_";
}
print Dumper $value;

これは、 でエラーをキャッチしたい場合Try::Tiny、 の処理を​​すべてブロックに入れ$valueなければならないことを意味しているようtryです。これは不便です。

誰がこれを引き起こしているのか教えてもらえますか (Perl でこれがどのように可能であるかの説明が欲しいです)? そして、それを修正する方法はありますか?

4

1 に答える 1

4
try{
    $reader->read(\$input);
}catch {
    warn "caught error: $_";
}                               <------ missing semicolon
my $value = $reader->value;

try実際には制御構造ではないことに注意してください。プロトタイプtrycatch単なる潜水艦です。&@catch何らかの形のオブジェクトを返すと思います。)そのため、上記のコードは次と同等です

&try(sub { ... }, &catch(sub { ... }, my $value = $reader->value));

への割り当てが?$valueの前に行われていることに注意してください。try

于 2013-06-19T20:53:24.973 に答える