Perl模块Capture :: Tiny捕获代码在字符串变量中

时间:2014-06-07 17:34:59

标签: perl

我正在尝试使用Perl模块Capture::Tiny来捕获经过评估的Perl代码。问题是“打印”功能在成功时返回1,如果打印是最后一个语句,则返回作为捕获的结果。如何避免这种情况。以下是代码。

use Capture::Tiny ':all';

my $code = << "PERL_CODE";
    print "Hello world\n";
    #raise_error();
PERL_CODE

my ($merged, @result) = capture_merged {eval $code};

if ($@) {
    $merged  = "Perl code error: $@\n$code\n$merged";
}

print "$merged" . join ("", @result);

输出不符合预期:

Hello world
1

输出中的1来自Perl“打印”功能。

当然有一个丑陋的解决方案就是把“归来”;作为代码片段中的最后一个语句,但我不希望它在你忘记的情况下是这样的。

my $code = << "PERL_CODE";
    print "Hello world\n";
    #raise_error();
    return; # this will not return the 1 from the Print function above but ugly.
PERL_CODE

2 个答案:

答案 0 :(得分:2)

捕获的STDOUT位于$merged,而代码返回的值 - 1如您所说 - 位于@result

如果您不想看到1,请不要打印@result

你希望在那里找到别的东西吗?任何代码块返回的值很少打印,因此您通常不会看到它。

答案 1 :(得分:0)

1来自@result,最后您加入了@result,因此您获得了1。

尝试以下

if ($@) {
    $merged  = "Perl code error: $@\n$code\n$merged";
}
#print "merged is $merged result is @result";
print "$merged";
相关问题