如何将系统命令的结果存储在Perl变量中?

Laz*_*zer 22 perl command system

$ 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
$
Run Code Online (Sandbox Code Playgroud)

我想将结果捕获11到变量中.我怎样才能做到这一点?

Nik*_*ain 50

来自Perlfaq8:

你混淆了system()反引号(``)的目的.system()运行命令并返回退出状态信息(作为16位值:低7位是进程死亡的信号,如果有的话,高8位是实际退出值).反引号(``)运行命令并返回它发送给STDOUT的内容.

$exit_status   = system("mail-users");
    $output_string = `ls`;
Run Code Online (Sandbox Code Playgroud)

有许多方法可以从Perl执行外部命令.最常见的含义是:

  • system():您想要执行命令而不想捕获其输出
  • exec:你不想返回调用perl脚本
  • 反引号:你想捕获命令的输出
  • open:您希望将命令(作为输入或输出)传递给脚本

另请参阅如何从外部命令捕获STDERR?

  • 值得注意的是:如果您希望输出在换行符上分割*(这可能是带有 `ls` 的示例中的情况)*,只需将其分配给“数组”变量即可。即用 `@output_string = \`ls\`` 替换 `$output_string = \`ls\`` (3认同)

Pet*_*ans 11

最简单的方法是使用``Perl中的功能.这将执行内部的内容并返回打印到stdout的内容:

 my $pid = 5892;
 my $var = `top -H -p $pid -n 1 | grep myprocess | wc -l`;
 print "not = $var\n";
Run Code Online (Sandbox Code Playgroud)

这应该做到这一点.


小智 7

尝试使用qx{command}而不是反引号.对我来说,它更好一点,因为:你可以用它做SQL,而不用担心转义引号等.根据编辑器和屏幕的不同,我的老眼睛往往会错过微小的背蜱,并且不应该像使用尖括号而不是全局那样过载.