我如何打印到 Perl 中的变量?

How can I print to a variable in Perl?

我已经定义了一堆函数,它们做了很多工作并且有一堆打印语句。可以像这样调用它们来构建一个 html 页面。

print_A()
print_B()
print_C()

现在,我想调用这些函数并将这些打印语句的内容存储到一个主变量中。一种方法是重写这些函数,使它们 return 一个包含其内容的字符串(而不是打印)

my $var = "";
$var = $var . store_A();
$var = $var . store_B();
$var = $var . store_C();

但我想在不修改或重写函数的情况下执行此操作。我不想用这么小的改动重新定义这些函数(程序中有数百个这样的函数)。

在 perl 中有更短更快的方法吗?

一种方法是使用 select 将 STDOUT 重定向到标量变量:

use warnings;
use strict;

my $out;
open my $fh, '>', $out;
my $old_stdout = select $fh;
s1();
s2();
select $old_stdout;
close $fh;

print "start\n";
print $out;
print "end\n";

sub s1 {print "s1\n"}
sub s2 {print "s2\n"}

打印出来:

start
s1
s2
end

根据这些函数的作用,您可以在子进程中 运行 它们并捕获它们的输出:

my $pid = open(PIPE, "-|");
if (0 == $pid) {
    # Child
    print_A();
    print_B();
    print_C();
    exit(0);
}
else {
    my $var = "";
    while(<PIPE>) {
       $var .= $_;
    }
    close(PIPE);
}

您必须评估将这些函数调用移动到子进程中是否安全。如果其中一个函数更改了进程的全局状态——例如,如果它修改了一个全局变量——那么该更改将仅限于子进程,而不会发生在原始脚本进程中。

您还可以使用 IO::Scalar 将变量绑定到 STDOUT。

use IO::Scalar;

my $output_str;
tie *STDOUT, 'IO::Scalar', $output_str;
print "Hel", "lo, ";
print "world!\n";

untie *STDOUT;
print "output_str is $output_str\n";

# prints
# output_str is Hello, world!

尽管与@toolic 的回答没有明显不同。