2012-01-24 14 views
5

मेरे पास यह पर्ल कोड है जो केवल सभी पंक्तियों की बजाय पहली पंक्ति प्रिंट कर रहा है।पर्ल फोरैच लूप प्रिंट केवल एक पंक्ति

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 मानों का उपयोग करते हैं, इसलिए आप उन्हें नहीं देखते हैं।

एक त्वरित सुधार करने के लिए हो सकता है:

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

कौन सा ऊपर अपने इनपुट जिस तरह से आप इसे होने की उम्मीद कर रहे थे टूट जाएगा।

कुछ युक्तियां:

हमेशा use warnings; use strict;

और तुम कुछ उचित पर्ल सुविधाओं का उपयोग करना चाहिए:

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

धन्यवाद, टीएलपी। वह बहुत उपयोगी था। मैं विशेष रूप से अतिरिक्त जानकारी की सराहना करता हूं क्योंकि मैं पर्ल पर बेहतर होने की कोशिश करता हूं। –

+1

@senile_genius आपका स्वागत है। – TLP

संबंधित मुद्दे