如何在Perl中读取管道数据?

时间:2016-02-17 09:49:17

标签: python perl pipe

我有一段python脚本,我喜欢将其作为perl脚本开发。 它使用os.popen().readlines()从管道获取信息。我不明白这在Perl中是如何运作的。

请帮帮我吗?

旧Python代码:

hosts = os.popen('echo "GET hostgroups\nColumns: members\nFilter: name = HG_switches" | socat - /opt/colan/nagios/var/rw/live').readlines()
for item in hosts:
print item;

我的Perl代码:

open (my $fh, "<", 'echo "GET hostgroups\nColumns: members\nFilter: name = HG_switches" | socat - /opt/colan/nagios/var/rw/live'while (<$fh>) {  or die $!;
while (<$fh>) { 
print $fh;
}

1 个答案:

答案 0 :(得分:3)

open的模式无法正常运行。为了open这样的管道,您需要使用不同的符号。 <表示打开一个文件进行阅读,但您不是。

你想要;

open ( my $input_fh, '-|', $command_to_run ) or die $!;

但是对于更广泛的内容,您可能希望查看IPC::Open2IPC::Run2,它允许您打开输入和输出文件句柄。

open2 ( my $socat_stdou, my $socat_stdin, 'socat - /opt/colan/nagios/var/rw/live' );
print {$socat_stdin} "GET hostgroups\nColumns: members\nFilter: name = HG_switches";   
print <$socat_stdout>; 

IPC::Run3 / IPC::Open3也会给你STDERR。您可能会发现,您实际上并不需要向socat发送消息,但可以本机实现。