私は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
内で割り当てても、ブロックが終了すると次のようになります。try
undef
my $value;
try{
$reader->read(\$input);
$value = $reader->value;
}catch {
warn "caught error: $_";
}
print Dumper $value;
これは、 でエラーをキャッチしたい場合Try::Tiny
、 の処理をすべてブロックに入れ$value
なければならないことを意味しているようtry
です。これは不便です。
誰がこれを引き起こしているのか教えてもらえますか (Perl でこれがどのように可能であるかの説明が欲しいです)? そして、それを修正する方法はありますか?