我正在尝试使用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
答案 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";