我在使用foreach
循环遍历Perl数组时遇到问题。出于某种原因,Perl只循环遍历第一个值然后停止。
我不是手动创建数组,而是来自HTML::TreeBuilder::XPath
。
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;
}
谢谢,抱歉这个愚蠢的问题。
答案 0 :(得分:3)
您应该阅读the manual here
这是一个样本:
my @states = (
'Montana', 'Nebraska', 'Nevada',
'New Hampshire', 'New Jersey', 'New Mexico');
foreach my $state (@states) {
print "state is $state\n";
}
答案 1 :(得分: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$
打印所有州。但是,您错过了\n
末尾的print
。我会使用say
代替print
,因为say
会自动为\n
添加for my $state ( @states ) {
say $state;
}
。不易出错。
我会这样写循环:
@states
但是,正如您所看到的,@states
的Dumper输出与您的相同。这意味着我的#! /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
相同,我打印出所有状态(尽管不在单独的行上)。
我想也许你在每个州名的末尾都有一个CR,这导致了问题:
Montana
但输出与您的输出不匹配:
{{1}}
Dumper不仅与你所拥有的不同,而且,我不打印{{1}},因为每次打印出来都会覆盖状态。
还有其他事情正在发生,你必须向我们提供更多有关正在发生的事情的信息。正如旧程序员的格言所述:适用于我的计算机。