-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
#!/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 に答える
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 rootそのスクリプトは、またはのように呼び出されます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 に答える