web-dev-qa-db-ja.com

システムコマンドの結果をPerl変数に格納するにはどうすればよいですか?

$ 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
$

結果をキャプチャしたい、つまり11を変数に入れます。どうやってやるの?

22
Lazer

Perlfaq8 から:

system()backticks ( ``)の目的を混同しています。 system()は、コマンドを実行し、終了ステータス情報を返します(16ビット値として:下位7ビットはプロセスが停止したシグナルであり、上位8ビットは実際の終了値です)。バックティック( ``)はコマンドを実行し、STDOUTに送信したものを返します。

$exit_status   = system("mail-users");
    $output_string = `ls`;

Perlから外部コマンドを実行するには多くの方法があります。最も一般的な意味は次のとおりです。

  • system():コマンドを実行したいが、その出力をキャプチャしたくない
  • exec:呼び出し元のPerlスクリプトに戻りたくない
  • backticks:コマンドの出力をキャプチャしたい
  • open(入力または出力として)コマンドをスクリプトにパイプする

外部コマンドからSTDERRをキャプチャする方法は? も参照してください。

50
Nikhil Jain

最も簡単な方法は、`` Perlの機能。これは中にあるものを実行し、出力されたものを標準出力に返します:

 my $pid = 5892;
 my $var = `top -H -p $pid -n 1 | grep myprocess | wc -l`;
 print "not = $var\n";

これでうまくいくはずです。

11
Peter Tillemans

バックティックではなくqx{command}を使用してみてください。私にとっては、SQLを実行でき、引用符などのエスケープを心配する必要がないため、少し改善されています。エディターと画面にもよりますが、私の古い目は小さなバックティックを逃す傾向があり、アングルブラケットとグロブを使用するようなオーバーロードの問題はありません。

7
Ken Hylton

backtickまたはqxを使用すると、すべての回答に感謝します。ただし、backtickまたはqxを使用する場合、出力には末尾の改行が含まれているため、削除する必要があることがわかりました。そこで、chompを使用しました。

chomp($Host = `hostname`);
chomp($domain = `domainname`);
$fqdn = $Host.".".$domain;

詳細はこちら: http://irouble.blogspot.in/2011/04/Perl-chomp-backticks.html

2
Soumya Kanti

システム変数にbacktickを使用すると、結果をPerl変数に保存できます。

私の$ pid = 5892; my $ not = `` top -H -p $ pid -n 1 | grep myprocess | wc -l`; print "not = $ not\n";

1
Crazy coder