2017-06-20 8 views
-1

私はPerlでbashスクリプトを書き直しています。bashをPerlに翻訳する

元のスクリプトは、Linuxパッケージが未設定の状態にあるかどうかをチェックし、そうであれば削除して再インストールします。

#!/bin/bash 
if [[ $(dpkg -l | grep libc-bin | grep iF) || $(dpkg -l | grep libc-dev-bin | grep iU) ]] ; then 
    echo "do something" 
fi 

は、私はちょうどこれらの複数の変数の ifステートメントを実行し、システムコールを使用して変数としてそれらを格納してことができるかどうかを確認するために始めました。これはうまくいかないようでした。

#!/usr/bin/perl 

my $libcUnconfigured = system("dpkg -l | grep libc-bin | grep iF"); 
my $libcDevUnconfigured = system("dpkg -l | grep libc-dev-bin | grep iF"); 

if ($libcUnconfigured || $libcDevUnconfigured) { 
    print "Do something"; 
} 
+3

'system'は出力ではなく戻りコードを返します。代わりに 'qx //'を使用してください。 – simbabque

+2

なぜperlでgrepを使っていますか? – 123

+1

パッケージリストを取得する: 'my @libcUnconfigured = grep {/ libc-bin | iF /} qx(dpkg -l)'。 'qx'(" backticks ")はリストを返します。これは' grep'がフィルタリングしてリスト(配列)を取得します。 'qx'は'/bin/sh'またはシステムが提供するものを使用しますので、コマンドパスを指定する必要があります。 – zdim

答えて

4

waitによって返されたプログラムの終了ステータスを返しqx operator、ないsystemを使用する外部コマンドからの出力を受信するために。

私は、あなたがPerlでできないものに対してのみ、あるいはめったにあなたの仕事を大幅に簡素化するために外部プログラムを使うことを勧めます。それ以外はPerlの広範な処理能力を使用します。 list contextで使用する場合、この場合フィルタで

grep

によって dpkg -lから復帰
my @libcUnconfigured = grep { /libc-bin|iF/ } qx(dpkg -l); 

print "Do something with $_\n" for @libUnconfigured; 

qxここでgrepによって課され、出力の行のリストを返します。 grepのコードブロックは、各要素がデフォルトの$_ variableで使用可能な時点で要素で実行されます。正規表現の一致はデフォルトで$_で行われます。コードが真であると評価された項目は、リストとして返されます。ここでは配列に割り当てられています。

qxは、/bin/shを使用します。これはシステム上の別のシェルに委譲されている場合もあります。コマンドを注意深くまとめてください。エラーチェックについては、リンクされたドキュメントと$? in perlvarを参照してください。

また、いくつかのモジュールの1つにアクセスできます。素敵な1は、そのきれいな構文、それは私たちにエラーを渡して、ほぼすべてのコードを実行する能力について

キャプチャ::小型でシンプルな、ポータブルを提供するという事実のためCapture::Tiny

use warnings; 
use strict; 
use feature 'say'; 

use Capture::Tiny qw(capture); 

my @cmd = qw(dpkg -l); 

my ($stdout, $stderr) = capture { 
    system (@cmd); 
}; 

warn "Error with @cmd: $stderr" if $stderr; 

say "Do something with $_" for (split /\n/, $stdout); 

ですPerl、XSコード、または外部プログラムから来ているかどうかに関係なく、STDOUTまたはSTDERRに送信されたほとんどのものをキャプチャします。

ここでコマンドはリストとして形成され、systemはシェルをバイパスできます。 にシェルがない場合はが必要です。この場合の戻り値は、パッケージ情報を持つ行を処理するためのsplitの(おそらく複数行の)文字列です。

いくつかの他のものは、使用する機能と複雑さを増す中で、IPC::Run3IPC::Run

はまたthis entry in perlfaq8を参照してくださいです。いくつかの例で使用されるIPC::Open3はかなり低レベルであることに注意してください。

+0

非常に良い質問に対する非常に良い答えです。 –

+0

@CharlesDuffyありがとうございます。彼らは質問を丸めなかったのは残念です。それは基本的なものですが、少しだけ合理的であると思っていました。 – zdim

関連する問題