2013-11-26 105 views
-5

我遇到了使用foreach循環訪問Perl數組的問題。出於某種原因,Perl只循環第一個值,然後停止。我不是手動創建數組,它來自HTML::TreeBuilder::XPath在Perl數組中循環

print Dumper (@states); 

$VAR1 = 'Montana'; 
$VAR2 = 'Nebraska'; 
$VAR3 = 'Nevada'; 
$VAR4 = 'New Hampshire'; 
$VAR5 = 'New Jersey'; 
$VAR6 = 'New Mexico'; 

如果我傾倒出來作爲\@states,我得到這個:

$VAR1 = [ 
     'Montana', 
     'Nebraska', 
     'Nevada', 
     'New Hampshire', 
     'New Jersey', 
     'New Mexico' 
    ]; 

我需要在每個值運行額外的處理,所以我通過它與foreach迴路循環。

如果我運行

foreach my $state (@states) { 
    print $state; 
} 

只打印Montana

編輯:

的問題是,我是遍歷數組引用不正確。在perl 5.8.8我不得不運行它像:

foreach my $state (${@states}) { 
    print $state; 
} 

謝謝,對於愚蠢的問題抱歉。

+5

顯示您的foreach循環代碼。 – toolic

+2

如果我們沒有看到你的循環,很難猜測你的循環出了什麼問題。 – ikegami

+0

請注意,將數組和哈希的引用傳遞給'Dumper'將提供更清晰的結果。 (例如'print Dumper(\ @states);') – ikegami

回答

3

你應該閱讀the manual here

下面是一個示例:

my @states = (
    'Montana',  'Nebraska', 'Nevada', 
    'New Hampshire', 'New Jersey', 'New Mexico'); 

foreach my $state (@states) { 
    print "state is $state\n"; 
} 
+0

我不是手動填充陣列,它是來自什麼地方HTML :: TreeBuilder作爲:: XPath的 – user2630270

+3

@ user2630270,不要緊,你如何填充它。正如你看到的使用Data :: Dumper,數組是一樣的。正如你所看到的,你所說的代碼不起作用。你還沒有提供你的問題的演示。 – ikegami

0

這是一個測試程序:

#! /usr/bin/env perl 

use strict; 
use warnings; 
use feature qw(say); 

use Data::Dumper; 

my @states = ('Montana',  'Nebraska', 'Nevada', 
      'New Hampshire', 'New Jersey', 'New Mexico'); 

say "Dumping \@states\n" . Dumper @states; 

say "\nDumping \\\@states\n" . Dumper \@states; 

foreach my $state (@states) { 
     print $state;} 

這裏是我的結果:

$ test.pl 
MontanaNebraskaNevadaNew HampshireNew JerseyNew Mexico$ 

打印所有的州。但是,您在print的末尾缺少\n。我會使用say而不是print,因爲say會自動爲您添加\n。不太容易出錯。

我會這樣寫循環:

for my $state (@states) { 
    say $state; 
} 

然而,正如你所看到的,我的自卸車輸出@states是一樣的你。這意味着我的@states與您的相同,並且我打印出所有狀態(儘管不在單獨的行中)。

我想也許你以某種方式對每個國家的名字,並且結束一個CR是造成問題:

#! /usr/bin/env perl 

use strict; 
use warnings; 
use feature qw(say); 

use Data::Dumper; 

my @states = ("Montana\r",  "Nebraska\r", "Nevada\r", 
      "New Hampshire\r", "New Jersey\r", "New Mexico\r"); 

say "Dumping \@states\n" . Dumper @states; 

say "\nDumping \\\@states\n" . Dumper \@states; 

foreach my $state (@states) { 
     print $state;} 

但產量不您的輸出匹配:

$ ./test.pl 
Dumping @states 
';AR1 = 'Montana 
';AR2 = 'Nebraska 
';AR3 = 'Nevada 
';AR4 = 'New Hampshire 
';AR5 = 'New Jersey 
';AR6 = 'New Mexico 


Dumping \@states 
$VAR1 = [ 
',  'Montana 
',  'Nebraska 
',  'Nevada 
',  'New Hampshire 
',  'New Jersey 
'   'New Mexico 
     ]; 

$ w Mexicoire 

不僅Dumper與你有什麼不同,而且我也沒有打印出Montana,因爲我每次打印時都會覆蓋這些狀態。

別的東西是怎麼回事,你得給我們更多的信息到底是怎麼回事。作爲老程序員的格言說:它的工作原理上。