如果有任何更改,需要进行以下Perl eval子弹证明?

时间:2013-05-23 07:20:47

标签: perl exception-handling

eval {
    # here is put some code that may throw exception
    return 1;
} or do {
   my $error = $@;
   # Handle error.
};
  1. 以下样式是否可以防止$ @未设置 对吗?
  2. 以下“1”是什么防范?
  3. “或者做”比“if($ @){”更好吗?如果是这样,为什么?

3 个答案:

答案 0 :(得分:9)

有关使用eval作为try - 类型语句时可能出错的问题的讨论,请参阅Try::Tiny文档,如何避免这些问题以及发布的代码结束的原因使用1(以确保eval块在成功完成时返回true值。)

阅读之后,请考虑使用Try :: Tiny,而不是通过所有的旋转来确保每个eval都能正常运作try。毕竟,懒惰是程序员的first great virtue

答案 1 :(得分:1)

你可以写上面的eval,

my $result = eval {
    # here is put some code that may throw exception
    1;  # Why is the "1;" here ?
};

在这种情况下,$result仅在 eval 内没有异常时才会1,否则为undef。

因此,在这种特殊情况下,1可确保在没有异常的情况下or do {..}不会被执行。

if ($@) {..}或许更习惯于做同样的事情,$@eval{..}失败时始终设置为{{1}}。

答案 2 :(得分:1)

  

进行以下Perl eval子弹证明需要进行哪些更改?

如果我没记错的话,如果你关心$ @的内容(而不仅仅是它是否真实),你还需要防止$ @被其他代码覆盖掉,然后才会看到它(见回答1.以下)。

  
      
  1. 以下样式是否可以防止$ @未正确设置?
  2.   

是的,$ {可以在evalif之间的时间内被覆盖。如果我没记错的话,最常见的情况是使用成功的eval超出范围的对象的DELETE方法(因为它在eval中)。

  

以下“1”是什么防范?

常量true值(不一定是1)用于确保eval块返回true值。如果块中的代码死掉,那么该块将返回一个空字符串,并且do块将运行。如果您确定块中的最后一个语句将始终为真,那么这是不必要的;但是,没有理由不确定恒定值。

  

“或者{”比“if($ @){”更好吗?如果是这样,为什么?

它避免了必须存储eval块的返回值。你可以说

my $result = eval {
    #do stuff
    1;
};
unless ($result) {
    # handle error
}