-2

我在学校和网络编程课上。我根本没有 Perl 经验。我们的任务如下。

编写一个短程序,使用反引号 `` 函数运行外部命令 ps -aux 以列出用户拥有的所有当前正在运行的进程,其用户名作为命令行参数给出。

暗示:

$ARGV[0] or die "without a username given\n";
my $.... = $ARGV[0];
my @ps = `ps -axu`;
foreach my $..... (@ps) {
print $line if …../;
}

我已将代码更改为:

#!/usr/local/bin/perl -w
use strict;
use warnings;
my $line;

$ARGV[0] or die "without a username given\n";
my $test = $ARGV[0];
my @ps = `ps -axu`;
foreach my $test (@ps) {
print $line if ...../;
}

但是,我不断收到此错误:

C:\Perl\W4A2new.pl 第 10 行的语法错误,靠近“if ...”搜索模式未在 C:\Perl\W4A2new.pl 第 10 行终止。

谁能帮我吗???请。谢谢你。

4

2 回答 2

0
  1. ps命令通常以类似的方式调用ps aux(不带前导减号)。
  2. 在 ps 参数中指定用户名没有效果我可以看到
  3. 使用反引号很方便,但可能被认为是不好的风格。
  4. 输出的第一列ps aux可以包含数字用户 ID。
  5. 我们可以使用/etc/passwd在用户 ID 和用户名之间进行转换。

这是打印出所有ps以给定字符串开头的行的代码:

#!/usr/bin/perl
use strict; use warnings;

print grep /^\Q$ARGV[0]\E/, `ps aux`;

最后一行可以写得很详细:

my @temp;
for (`ps aux`) {
  push @temp, $_ if /^\Q$ARGV[0]\E/;
}
print @temp;

该脚本将像perl script.pl rootor一样被调用perl script.pl 1000

现在正如我所说,我们可以在用户名和用户 ID 之间进行转换。此外,我们可以将ps输出视为列数据。列是

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

我们可以通过my @cols = split ' ', $line, 11. 我们必须指定最大列数,因为命令可能包含空格。如果用户只包含数字字符,我们将转换为相应的名称/etc/passwd

#!/usr/bin/perl
use strict; use warnings;

my $username = $ARGV[0] or die <<"END_USAGE";
USAGE: perl $0 USERNAME
    USERNAME -- the full username you want ps output for.
END_USAGE

my %id_2_name = do {
  open my $passwd, "<", "/etc/passwd" or die "Can't open passwords: $!";
  map { (split /:/)[2,0] } <$passwd>;
};

open my $ps, "-|", "ps", "aux" or die "Can't open ps command: $!";

while(<$ps>) {
  my @cols = split ' ', $_, 11;
  $cols[0] = $id_2_name{$cols[0]} unless $cols[0] =~ /[^0-9]/;
  print join " ", @cols if $cols[0] eq $username;
}
于 2013-02-13T09:02:55.240 回答
0
#!/usr/local/bin/perl -w
use strict;
use warnings;


my $username = $ARGV[0] or die "without a username given\n";
my @ps = `ps -axu $username`;
foreach my $line (@ps) {
   print $line, "\n";
}

您必须以这种方式执行此脚本(假设脚本名称为 myscript.pl):

perl myscript.pl your_operating_system_user_name
于 2013-02-12T22:48:00.907 回答