$ cat test.pl
my $pid = 5892;
my $not = system("top -H -p $pid -n 1 | grep myprocess | wc -l");
print "not = $not\n";
$ perl test.pl
11
not = 0
$
我想将结果即11
捕获到变量中。我怎么能这样做?
答案 0 :(得分:47)
来自Perlfaq8:
你混淆了system()和backticks(``)的目的。 system()运行命令并返回退出状态信息(作为16位值:低7位是进程死亡的信号,如果有的话,高8位是实际退出值)。反引号(``)运行命令并返回它发送给STDOUT的内容。
$exit_status = system("mail-users");
$output_string = `ls`;
有许多方法可以从Perl执行外部命令。最常见的含义是:
答案 1 :(得分:10)
最简单的方法是在Perl中使用``
功能。这将执行内部的内容并返回打印到stdout的内容:
my $pid = 5892;
my $var = `top -H -p $pid -n 1 | grep myprocess | wc -l`;
print "not = $var\n";
这应该这样做。
答案 2 :(得分:7)
尝试使用qx{command}
而不是反引号。对我来说,它更好一点,因为:你可以用它做SQL而不用担心转义引号等。根据编辑器和屏幕的不同,我的老眼睛往往会错过微小的背嘀嗒声,并且不应该像使用尖括号而不是全局那样过载。
答案 3 :(得分:2)
使用backtick
或qx
帮助,感谢大家的答案。但是,我发现如果您使用backtick
或qx
,则输出包含尾随换行符,我需要将其删除。所以我使用了chomp
。
chomp($host = `hostname`);
chomp($domain = `domainname`);
$fqdn = $host.".".$domain;
更多信息: http://irouble.blogspot.in/2011/04/perl-chomp-backticks.html
答案 4 :(得分:1)
对系统命令使用反引号,这有助于将结果存储到Perl变量中。
我的$ pid = 5892; 我的$ not =``top -H -p $ pid -n 1 | grep myprocess | wc -l`; 打印“ not = $ not \ n”;
答案 5 :(得分:0)
也例如。你可以使用IPC::Run:
use IPC::Run qw(run);
my $pid = 5892;
run [qw(top -H -n 1 -p), $pid],
'|', sub { print grep { /myprocess/ } <STDIN> },
'|', [qw(wc -l)],
'>', \my $out;
print $out;