循环通过Perl数组

时间:2013-11-26 14:37:50

标签: arrays perl reference

我在使用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;
}

谢谢,抱歉这个愚蠢的问题。

2 个答案:

答案 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}},因为每次打印出来都会覆盖状态。

还有其他事情正在发生,你必须向我们提供更多有关正在发生的事情的信息。正如旧程序员的格言所述:适用于我的计算机