2012-01-24 19 views
5

すべての行ではなく最初の行だけを表示するこのPerlコードを持っています。Perl foreachループは1行だけを出力します

use Net::SSH::Perl; 
my $user = "user"; 
my $cmd = "df -m | grep data"; 
my $host = "host1.example.com"; 

my $ssh = Net::SSH::Perl->new($host); 
$ssh->login($user); 
my ($dflines,$errors,$exit) = $ssh->cmd($cmd); 
foreach $line ($dflines) { 
    print "$line"; 
    my @values = split(' ',$line); 
    my ($MBsize, $MBused, $MBavail, $dir) = 
     ($values[1], $values[2], $values[3], $values[5]); 
    print "MBsize=$MBsize MBused=$MBused MBavail=$MBavail dir=$dir\n"; 
} 

それは印刷されます。

/dev/sdb1    1407118 931813 403828 70% /data1 
/dev/sdc1    1407118 921739 413902 70% /data2 
/dev/sdd1    1407118 909408 426233 69% /data3 
/dev/sde1    1407118 918828 416813 69% /data4 
/dev/sdf1    1407118 922335 413306 70% /data5 
MBsize=1407118 MBused=931813 MBavail=403828 dir=/data1 

私が期待する:

/dev/sdb1    1407118 931813 403828 70% /data1 
/dev/sdc1    1407118 921739 413902 70% /data2 
/dev/sdd1    1407118 909408 426233 69% /data3 
/dev/sde1    1407118 918828 416813 69% /data4 
/dev/sdf1    1407118 922335 413306 70% /data5 
MBsize=1407118 MBused=931813 MBavail=403828 dir=/data1 
MBsize=1407118 MBused=921739 MBavail=413902 dir=/data2 
MBsize=1407118 MBused=909408 MBavail=426233 dir=/data3 
MBsize=1407118 MBused=918828 MBavail=416813 dir=/data4 
MBsize=1407118 MBused=922335 MBavail=413306 dir=/data5 

私はそれが基本的な何かはほぼ確実です。 何か助けていただければ幸いです。 ありがとう!それは配列ではなく、スカラー以来、

foreach $line ($dflines) { 

あなただけの一回の反復を実行している:

+0

忘れないでください。 '警告を使用する; – Ether

答えて

16

問題は、このラインです。 print "$line"あなたがキャプチャしたすべての行を実際に印刷しますが、ループ内の多くの値を印刷したように見えます。その後の部分では:

my @values = split(' ',$line); 
my ($MBsize, $MBused, $MBavail, $dir) = 
     ($values[1], $values[2], $values[3], $values[5]); 
print "MBsize=$MBsize MBused=$MBused MBavail=$MBavail dir=$dir\n"; 

あなただけの分割の最初のいくつかの値を使用しますが、その行の残りの部分は、同様にそこにあります。つまり、@valuesには、期待する値がすべて含まれています。範囲0..5には最初の行が、6.10には次の行が続きます。最初の6つの値しか使用しないので、それらの値は表示されません。

Aクイックフィックスは何をするかもしれません:あなたの入力あなたはそれがあることを期待していた道を破る

foreach $line (split /\n/, $dflines) { 

いくつかのヒント:常に

use warnings; use strict;

そして、あなたは、いくつかの適切なPerlの機能を利用する必要があります。

for my $line (split /\n/, $dflines) { 
    print $line; 
    my @values = split ' ', $line; 
    printf "MBsize=%s MBused=%s MBavail=%s dir=%s\n", @values[1,2,3,5]; 
} 

あなたが定期的に出力した後MBsize ...行を印刷するように見えます。もしそうなら、配列の中に行を格納し、ループの後に印刷することができます:

my @print; 
for my $line (split /\n/, $dflines) { 
    print $line; 
    my @values = split ' ', $line; 
    push @print, sprintf "MBsize=%s MBused=%s MBavail=%s dir=%s\n", @values[1,2,3,5]; 
} # note ----^ sprintf instead 
print @print; 
+1

ありがとう、TLP。それは非常に便利でした。私はperlでより良くなるように努力するので、特に余分な情報に感謝します。 –

+1

@senile_geniusようこそ。 – TLP

関連する問題