我正在使用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
非空。即使我$value
在try
块内分配,它也会在块完成时变为undef
:
my $value;
try{
$reader->read(\$input);
$value = $reader->value;
}catch {
warn "caught error: $_";
}
print Dumper $value;
这似乎意味着如果我想用 捕获错误Try::Tiny
,我必须将我的所有处理$value
放入try
块中,这很不方便。
谁能告诉我是什么原因造成的(我想解释一下这在 Perl 中是如何实现的)?有没有办法解决它?