Perl 捕获脚本输出并在实际写入之前对其进行处理
我可以控制一个perl脚本,这是早期需要的另一个CGI脚本。我需要捕获主脚本的所有输出,并能够以某种方式对其进行更改 这是实际的链接:Perl 捕获脚本输出并在实际写入之前对其进行处理,perl,Perl,我可以控制一个perl脚本,这是早期需要的另一个CGI脚本。我需要捕获主脚本的所有输出,并能够以某种方式对其进行更改 这是实际的链接: [index.cgi] > (require) > [header.pl] > (eval 'cat ...') > [my_script.pl] 我知道我可以使用END块在整个程序的末尾生成后处理部分,但是我需要一种方法来开始捕获所有输出 编辑:我刚刚发现,它允许我们: use Capture::Tiny ':all'; ($std
[index.cgi] > (require) > [header.pl] > (eval 'cat ...') > [my_script.pl]
我知道我可以使用END块在整个程序的末尾生成后处理部分,但是我需要一种方法来开始捕获所有输出
编辑:我刚刚发现,它允许我们:
use Capture::Tiny ':all';
($stdout, $stderr, @result) = capture {
# your code here
};
但这需要我将所有代码放在大括号之间,这是不可行的,因为我无法访问主调用脚本(它需要我的脚本)。这有助于澄清我希望在执行句子时立即开始捕获输出。这解决了我的问题:
my $OUTPUT;
my $OUTPUT_FH;
my $OLD_FH;
open( $OUTPUT_FH, '>', \$OUTPUT ) or die;
$OLD_FH = select $OUTPUT_FH;
END {
select $OLD_FH;
close $OUTPUT_FH;
# Change the output
$OUTPUT =~ s/pattern/replacement/flag;
print $OUTPUT;
}
解决方案工作于:将以下内容放入调用者执行的文件中
#!/bin/sh
/path/to/actual_script "$@" | perl -pe's/.../.../g'
你不能那样做。Perl代码无法访问输出缓冲区。无论如何,这是一个可怕的想法:为什么你不能在第一时间打印正确的东西呢?如果将输出打印到标量变量,可能会有所帮助。然后,在最终将该变量打印到输出之前,您可以对该变量执行您喜欢的操作。它输出到一个标量变量,这就是我所说的“如果您将输出输出输出到一个标量变量,它可能会有所帮助”。请提出你想实现什么的问题,而不是选择解决方案并询问如何实施……你是对的。我将重新表述这个问题(这样它就不会给未来的读者增加噪音)。我要求的是我记得我在Perl中做过的事情,但实际上是PHP。这强化了要求实现某些目标的需要,而不是要求如何实现具体的解决方案。