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非空。即使我$valuetry块内分配,它也会在块完成时变为undef

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实际上不是控制结构。try并且catch只是&@原型的替代品。(我想这会catch返回某种形式的对象。)因此,上面的代码相当于

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

请注意$valuetry?

于 2013-06-19T20:53:24.973 回答