我正在尝试获取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();
答案 0 :(得分:4)
阅读documentation! split有第三个参数限制结果字段的数量。将其设置为您想要的字段数:
my @fields = split ' ', $_, 8;
此外,使用带有词法文件句柄和错误处理的3-arg形式的open
是一个好习惯:
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";
答案 1 :(得分:0)
使用@amon解决方案,这是完整的代码(更简单):
use strict;
use warnings;
my $result = qx!ps -ef!;
my @fields = split /\s+/, $result, 8;
print "@fields\n";