2013-06-19 32 views
1

我正在使用Marpa::R2,並試圖使用Try::Tiny來捕獲錯誤。我很困惑,因爲當我將解析代碼放入try塊中時,value方法的結果是undef。這裏是我的代碼:嘗試後的內部狀態更改{} Block

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非空值。即使我的try塊內分配$value,它成爲undef當塊已完成:

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

這似乎意味着,如果我想趕上錯誤與Try::Tiny,我已經把我所有的$value處理進入try區塊,這很不方便。

任何人都可以告訴我是什麼原因引起的(我想解釋一下在Perl中這是如何實現的)?有沒有辦法解決它?

回答

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

請記住,try實際上並不是控制結構。 trycatch僅僅是&@原型的子集。 (I想象catch返回某種形式的對象。)。這樣,上面的代碼等同於

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

通知如何分配給$value被所述try之前完成?