1

我有一个加密文件 X1,我有一个解密 X1 的 Perl 程序 P1。我正在使用 Perl 程序 p2 解析解密的文件。

X1--P1(decrypter) --> X2(plain text file) --p2(parser) --> parse output

我的解析器基于XML::Parser。它可以与解密文件的文件句柄一起使用。现在我得到 X2 并将其存储在文件系统中并在 P2 中读取并解析它。有没有办法我可以直接通过 P1 的输出获取文件句柄并使用 P2 中的文件句柄直接解析它而不需要临时文件?

4

3 回答 3

4

假设您正在使用非常弱的加密:

#! /usr/bin/perl

print <<EOXML;
<doc>
  <elem attr="Hello, world!" />
</doc>
EOXML

使用open $fh, "-|", ...将创建一个连接到子进程标准输出的管道:

#! /usr/bin/perl

use warnings;
use strict;

open my $decrypted, "-|", "./decrypt"
  or die "$0: open: $!";

while (<$decrypted>) {
  print "got: $_";
}

输出:

得到:<文档>
得到:<elem attr="你好,世界!" />
得到:</doc>
于 2010-04-07T14:03:51.700 回答
3

我不确定我是否完全理解您的意思,但听起来您只想使用管道。您可以在 shell 中通过将一个程序的 STDOUT 重定向到另一个程序的 STDIN 来做到这一点

$ foo | bar

或者您可以在 Perl 中通过直接打开另一个程序的管道来实现。

如果您需要控制 STDERR,另请参阅IPC::Open3 。

于 2010-04-07T14:01:42.617 回答
1

你为什么不让你的程序从 STDIN 读取并写入 STDOUT 并在命令行上将命令一起传递?

于 2010-04-07T14:02:10.323 回答