我有一段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;
}
答案 0 :(得分:3)
您open
的模式无法正常运行。为了open
这样的管道,您需要使用不同的符号。 <
表示打开一个文件进行阅读,但您不是。
你想要;
open ( my $input_fh, '-|', $command_to_run ) or die $!;
但是对于更广泛的内容,您可能希望查看IPC::Open2
和IPC::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
发送消息,但可以本机实现。