【发布时间】:2014-11-26 11:43:57
【问题描述】:
假设一个管道包含三个程序:
start | middle | end
如果 start 和 end 现在是一个 perl 脚本的一部分,我如何通过 perl 脚本中的 shell 命令管道数据,以便通过 middle?
我尝试了以下方法(抱歉缺少严格模式,它应该是一个简单的概念证明):
#!/usr/bin/perl -n
# Output of "start" stage
$start = "a b c d\n";
# This shell command is "middle"
open (PR, "| sed -E 's/a/-/g' |") or die 'Failed to start sed';
# Pipe data from "start" into "middle"
print PR $start;
# Read data from "middle" into "end"
$end = "";
while (<PR>) {
$end .= $_;
}
close PR;
# Apply "end" and print output
$end =~ s/b/+/g;
print $end;
预期输出:
- + c d
实际输出:
无,直到我按 ENTER,然后我得到- b c d。 middle 命令正在从 start 接收数据并对其进行处理,但输出将发送到 STDOUT 而不是 end。此外,从middle 读取的尝试似乎是从 STDIN 读取的(因此按 ENTER 的相关性)。
我知道这一切都可以在一行 perl(或 sed)中轻松完成;我的问题是如何在 perl 中进行管道,而不是如何替换字符串中的字符。
【问题讨论】:
-
问题的另一部分是如何在向
start写入数据后关闭middle的STDIN,同时仍然能够从middle的STDOUT 中读取直到它关闭。