gpt4 book ai didi

Perl:使用 shell 命令(管道)处理字符串

转载 作者:行者123 更新时间:2023-12-01 11:36:00 29 4
gpt4 key购买 nike

假设管道包含三个程序:

开始 |中间|结束

如果 startend 现在是一个 perl 脚本的一部分,我如何通过 perl 脚本中的 shell 命令管道传输数据,以便通过 中间?

我尝试了以下方法(很抱歉缺少严格模式,这应该是一个简单的概念证明):

#!/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 dmiddle 命令正在从 start 接收数据并对其进行处理,但输出将转到 STDOUT 而不是 end。此外,从 middle 读取的尝试似乎是从 STDIN 读取(因此按下 ENTER 的相关性)。

我知道这一切都可以在一行 perl(或 sed)中轻松完成;我的问题是如何在 perl 中进行管道传输,而不是如何替换字符串中的字符。

最佳答案

您可以使用 IPC::Open2 为此。

此代码创建两个文件句柄:$to_sed ,你可以print向程序发送输入,$from_sed你可以readline (或 <$from_sed> )从中读取程序的输出。

use IPC::Open2;

my $pid = open2(my ($from_sed, $to_sed), "sed -E 's/a/-/g'");

大多数情况下涉及 shell 是最简单的,但是有一个替代调用允许您绕过 shell 而是运行一个程序并填充它的 argv直接地。它在链接文档中进行了描述。

关于Perl:使用 shell 命令(管道)处理字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27148306/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com