perl - 为什么即使我从 Try::Tiny 的 finally block 返回一个值,也会收到 'use of uninitialized value' 警告?

标签 perl assignment-operator

我不清楚为什么下面的代码会给我错误:

在组合_op_test.pl 第 12 行使用未初始化值加法 (+)。

我希望 $success_count 的值在每次迭代时按子例程返回的值递增。

这是代码:

#!/usr/bin/env perl 
use strict;
use warnings;

use 5.014;
use Try::Tiny;

my $success_count = 0;

for ( 1..10 ) {
    $success_count += error_causing_sub();
}

sub error_causing_sub {
   try {
        die ("Error.");
   } catch { 
   } finally {
        if (@_) { 
            say "Error occured.";
            return 0;
        }
        else {
            say "Error did not occur.";
            return 1;
        }
   };
}

感谢任何帮助。

最佳答案

CAVEATS 中所述文档部分中,return 不是从 sub 返回,而是从 finally 返回:

return returns from the try block, not from the parent sub (note that this is also how eval works, but not how TryCatch works):

sub parent_sub {
  try {
    die;
  }
  catch {
    return;
  };
  say "this text WILL be displayed, even though an exception is thrown";
}

@simbabque notesfinally 的返回值被忽略。如果try失败,catch的返回值是相关的,并且它是空的:

The return value of the catch block is not ignored, so if testing the result of the expression for truth on success, be sure to return a false value from the catch block: ...

下面的代码对我来说看起来更符合逻辑:

#!/usr/bin/env perl
use strict;
use warnings;

use 5.014;
use Try::Tiny;

my $success_count = 0;

for ( 1..10 ) {
    $success_count += error_causing_sub();
}

say $success_count;

sub error_causing_sub {
    my $ret;
    try {
        die ("Error.") if rand(1) < 0.5;
        say "Error did not occur.";
        $ret = 1;
    } catch {
        say "Error occured.";
        $ret = 0;
    };

    return $ret;
}

此外,据我所知,the issues with eval that made Try::Tiny relevant were fixed in 5.14 。因此,您最好只使用它:

#!/usr/bin/env perl
use strict;
use warnings;

use 5.014;

my $success_count = 0;

$success_count += error_causing_sub() for 1 .. 10;

say $success_count;

sub error_causing_sub {
    my $ret;
    eval {
        die ("Error.") if rand(1) < 0.5;
        say "Error did not occur.";
        $ret = 1;
    } or do {
        say "Error occured.";
        $ret = 0;
    };

    return $ret;
}

关于perl - 为什么即使我从 Try::Tiny 的 finally block 返回一个值,也会收到 'use of uninitialized value' 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45865324/

相关文章:

c - 你喜欢 "if (var)"还是 "if (var != 0)"?

perl - 在 perl 中,如何计算位设置高于 2_147_483_639 的位向量中的位?

perl - SSL23_GET_SERVER_HELLO :unknown protocol while running perl script

c++ - 构造函数和 operator= 具有动态内存分配

c++ - 使用 std::vector 移动和复制语义

c++ - 两个不是我自己的类的自定义赋值运算符

perl - Perl Eval 中的警告

perl - Perl有哪些好的自然语言解析工具?

c++ - 使用赋值运算符重载从类中返回jobject

C++: "T a = b"-- 复制构造函数还是赋值运算符?