2012-01-24 25 views
5

Tôi có mã Perl này chỉ in dòng đầu tiên thay vì tất cả các dòng.Perl foreach loop print chỉ có một dòng

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"; 
} 

It in:

/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 

Tôi mong chờ:

/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 

Tôi gần như chắc chắn đó là một cái gì đó cơ bản. Bất kỳ trợ giúp nào được đánh giá cao. Cảm ơn!

+0

đừng quên: 'sử dụng nghiêm ngặt; sử dụng cảnh báo; ' – Ether

Trả lời

16

Vấn đề là dòng này:

foreach $line ($dflines) { 

Bạn chỉ được thực hiện một lần lặp, vì đó không phải là một mảng, nhưng một vô hướng. Khi bạn print "$line" nó thực sự in tất cả các dòng mà bạn đã chụp, nhưng tôi đoán có vẻ như bạn đã in nhiều giá trị trong một vòng lặp. Trong phần tiếp theo:

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"; 

Bạn chỉ sử dụng một vài giá trị đầu tiên của phần tách, nhưng phần còn lại của giá trị đó nằm trong đó. Nói cách khác, @values chứa tất cả các giá trị bạn mong đợi. Phạm vi 0..5 chứa hàng đầu tiên, 6..10 tiếp theo, v.v. Vì bạn chỉ sử dụng 6 giá trị đầu tiên, bạn không thấy chúng.

Khắc phục nhanh có thể làm:

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

Trong đó sẽ chia tay đầu vào của bạn theo cách mà bạn mong đợi nó được.

Một số lời khuyên:

Luôn use warnings; use strict;

Và bạn nên tận dụng một số tính năng perl thích hợp:

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]; 
} 

Dường như bạn muốn in các MBsize ... dòng sau khi đầu ra thường xuyên. Nếu có, bạn chỉ có thể lưu trữ các dòng trong một mảng và in sau vòng lặp:

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

Cảm ơn, TLP. Đó là siêu hữu ích. Tôi đặc biệt đánh giá cao các thông tin bổ sung khi tôi cố gắng để có được tốt hơn ở perl. –

+1

@senile_genius Bạn được chào đón. – TLP

Các vấn đề liên quan