0

我正在尝试获取ps -ef命令的结果,但遇到了一个问题。

因为$cmd它不打印完整的命令,只是在命令争论之间的空间处分割。

它打印这个:

jill 61745 8888 0 11:03 ? 00:00:04 php-fpm:

什么时候应该打印这个:

jill 61745 8888 0 11:03 ? 00:00:04 php-fpm: pool www

我知道一个正则表达式可以做到这一点,但我究竟应该做什么对我来说并不清楚。

sub refresh {
        open(OPENPIPE, "ps -ef|");
        while (<OPENPIPE>) {
                my ($uid, $pid, $ppid, $c, $stime, $tty, $time, $cmd) = split();
                print "$uid $pid $ppid $c $stime $tty $time $cmd\n";
        }
        close(OPENPIPE);
}
refresh();
4

2 回答 2

4

阅读文档!split 有第三个参数来限制结果字段的数量。将其设置为您想要的字段数:

my @fields = split ' ', $_, 8;

open此外,将 3-arg-form与词法文件句柄和错误处理一起使用是一个好习惯:

my @command = ("ps", "-ef");
open my $pipe, '-|', @command or die "Can't run @command: $!";
while (<$pipe>) {
  chomp;
  ...;
}
close $pipe or warn
  $! ? "Error when closing @command: $!"
     : "Return status $? from @command";
于 2013-04-13T16:09:52.717 回答
0

使用@amon 解决方案,这是完整的代码(更简单):

use strict;
use warnings;

my $result = qx!ps -ef!;
my @fields = split /\s+/, $result, 8;
print "@fields\n";
于 2013-04-13T16:13:51.503 回答