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

3 回答 3

9

请参阅Try::Tinyeval文档,以讨论在用作-type 语句时可能出错的事情try,如何避免它们,以及为什么您发布的代码以结尾1(以确保eval块在成功完成时返回真值)。

阅读后,考虑使用 Try::Tiny,而不是费尽心思地确保每个evals 都可以作为try. 毕竟,懒惰是程序员的第一大美德。

于 2013-05-23T08:08:04.540 回答
1

你可以在 eval 上面写,

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

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

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

if ($@) {..}可能是做同样事情的更惯用的方式,并且 $@总是在eval{..}失败时设置。

于 2013-05-23T07:27:49.100 回答
1

进行以下 Perl eval 防弹证明需要哪些更改(如果有)?

如果我没记错的话,如果您关心 $@ 的内容(而不仅仅是它是否正确),您还需要防止 $@ 在您查看它之前被其他死掉的代码覆盖(请参阅对 1 的回答。 以下)。

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

是的,$@ 可以在eval和之间的时间内被覆盖if。如果我没记错的话,最常见的情况是使用成功的eval.

下面的“1;”是什么意思?防范?

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

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

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

my $result = eval {
    #do stuff
    1;
};
unless ($result) {
    # handle error
}
于 2013-05-23T12:11:11.283 回答