假设有三个程序的管道:
start | middle | end
如果 start
和 end
现在是一个 Perl 脚本的一部分,如何通过 shell 命令将数据传递到 Perl 脚本中的管道中,以便经过 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
实际输出:
没有输出,直到我按下回车键,然后我得到- b c d
。 middle
命令从 start
接收数据并对其进行处理,但输出却发送到 STDOUT 而非 end
。 此外,从 middle
读取数据似乎是从 STDIN 而不是 end
(因此需要按下回车键)。
我知道这一切都可以在 perl(或 sed)的一行命令中轻松完成;我的问题是如何在 perl 中进行管道操作,而不是如何替换字符串中的字符。
middle
еҶҷе…Ҙstart
ж•°жҚ®еҗҺе…ій—ӯе…¶STDINпјҢеҗҢж—¶д»Қ然иғҪеӨҹд»Һmiddle
зҡ„STDOUTиҜ»еҸ–пјҢзӣҙеҲ°е®ғиў«е…ій—ӯгҖӮ - Mark K Cowan