2011-10-05 69 views
0

我想將我的foreach循環轉換爲子例程sub mybits。我確定我沒有正確地調用它或將它設置爲子類。無法打印出從perl子例程調用的變量

我想要做的是從子例程中返回一個值,它是我測試的三個變量中的任何一個,並且能夠獲取數據。

得到了這個mesg。我正在使用嚴格的警告:Can't modify non-lvalue subroutine call

如何調用此子例程來獲取我的變量($dir, $fname, $fsize)

代碼:

my $out; 
mybits (my $dir)=$out; 
print mybits($dir); 
print "This is mybits: $out\n"; 


sub mybits 
{ 
    foreach my $file(@{ $data->{file} }) 
    { 
     #my($dir, $fname); 
     my($dir, $fname, $fsize); 
     if($file->{path} =~ /^(.*)\/([^\/]+)$/) 
     { 
      $dir = $1; 
      $fname = $2; 
      $fsize = $file->{size}; 
     } 
     else 
     { 
      $dir = ""; 
      $fname = $file->{path}; 
     } 
     #print "This is the DIRECTORY: $dir\n"; 
     #print "This is the FILE:  $fname\n"; 
     #print "This is the FILE SIZE: $fsize\n"; 
    } 

} 
+1

你是否使用strict和使用警告?此外,它似乎並沒有顯示「mybits」正在返回任何東西。另外,爲什麼要將'mybits($ dir)'的值賦給未初始化的標量,然後期望'print mybits($ dir)'產生任何東西? – 2011-10-05 20:26:09

+0

是的,我編輯我的問題與mesg。謝謝。 – cjd143SD

+0

錯誤消息意味着您正試圖將子例程的返回值分配給其他標量。請解釋你正在嘗試做什麼。 – 2011-10-05 20:30:38

回答

1

這是不可能得到任何的$dir$fname,或$fsize在你的子程序書面,因爲它們的範圍僅限於您的子程序(具體到你的子程序中的foreach循環)。你必須讓你的子程序返回這些值。然而,由於這些在循環中一遍又一遍地使用,你可能想要返回所有可能的值。也許是這樣的:

sub mybits 
{ 
    my $return_dirs=[]; 
    my $return_fnames=[]; 
    my $return_fsizes=[]; 
    foreach my $file(@{ $data->{file} }) 
    { 
     #my($dir, $fname); 
     my($dir, $fname, $fsize); 
     if($file->{path} =~ /^(.*)\/([^\/]+)$/) 
     { 
      $dir = $1; 
      $fname = $2; 
      $fsize = $file->{size}; 
     } 
     else 
     { 
      $dir = ""; 
      $fname = $file->{path}; 
     } 
     #Put the relevant data into the array references that we'll return later. 
     push @$return_dirs,$dir; 
     push @$return_fnames,$fname; 
     push @$return_fsizes,$fsize; 
    } 

return [$return_dirs,$return_fnames,$return_fsizes]; 
} 

my $values=mybits(); 

foreach(@$values) 
{ 
    print join(",",@$_) . "\n"; 
} 

注:所有這些假設在mybits的代碼的其餘部分實際上是正常工作......考慮到OP只提供了一些代碼(例如,我們不知道是什麼$data是),我不能保證是這種情況。

+0

感謝您的回覆。我正在構建我的最後一個問題:http://stackoverflow.com/questions/7656290/not-array-reference-with-perl-xmlsimple-code。這顯示$數據。 – cjd143SD

+0

@ cjd143SD - 不客氣。那麼,你有沒有嘗試改變你的子程序? – 2011-10-05 23:04:41

+0

是的,我正在測試它。因此,如果'($ return_dirs,$ return_fnames,$ retrun_fsizes)'的值存儲在'my $ values'中,是否可以打印出其中的任何一個?假設我只想打印'$ return_dirs',我該怎麼做?謝謝。 – cjd143SD

1

這條線:

mybits (my $dir)=$out; 

嘗試分配$out由您的子程序的返回值。這是不可能的,它不是一個有效的左值因此錯誤。你到底想做什麼?

+3

更糟糕的是,因爲'mybits'沒有任何參數......我最好的猜測是OP試圖獲得'mybits'中定義的'$ dir'的值(當然這是不可能的,因爲'$ dir'的範圍在'mybits'裏面),但我無法確定。 – 2011-10-05 20:34:43