Perl 捕获脚本输出并在实际写入之前对其进行处理

Perl 捕获脚本输出并在实际写入之前对其进行处理,perl,Perl,我可以控制一个perl脚本,这是早期需要的另一个CGI脚本。我需要捕获主脚本的所有输出,并能够以某种方式对其进行更改 这是实际的链接: [index.cgi] > (require) > [header.pl] > (eval 'cat ...') > [my_script.pl] 我知道我可以使用END块在整个程序的末尾生成后处理部分,但是我需要一种方法来开始捕获所有输出 编辑:我刚刚发现,它允许我们: use Capture::Tiny ':all'; ($std

我可以控制一个perl脚本,这是早期需要的另一个CGI脚本。我需要捕获主脚本的所有输出,并能够以某种方式对其进行更改

这是实际的链接:

[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。这强化了要求实现某些目标的需要,而不是要求如何实现具体的解决方案。