2011-11-06 115 views
3

我开始学习Perl,这只是一个基本的小循环,为此我得到一个奇怪的输出,并希望对此有所澄清。在Perl中循环遍历一个列表

@numbers = {1,4,5,6,7,8,9}; 
for(my$i = 0; $i<=$#numbers; $i++) 
{ 
    print ("$numbers[$i}\n"); 
} 

输出是HASH(0x23a09c)。

这实际上意味着什么,为什么我会得到这个结果。

问候 阿里安

+1

你的例子有一个语法错误。确保你发布了你实际使用的内容。 – Mat

+0

我会,对不起...谢谢 – Arianule

回答

13

你想这样的:

@numbers = (1,4,5,6,7,8,9); 
foreach my $number (@numbers) 
{ 
    print ("$number\n"); 
} 

随着{1,4,5,6,7,8,9}您实际上是创建包含键值对(1 => 4, 5 => 6, 7 => 8, 9 => undef)一个匿名散列的引用。当您编写@numbers = {1,4,5,6,7,8,9};时,引用将成为存储在@numbers阵列中的唯一标量。此外,如果您只是想遍历元素,则不需要使用带有计数器的“经典”样式。

你可以这样做:

for my $number (1 .. 9) { 
    print "$number\n"; 
} 

请确保您有use strict;use warnings;在你写的每一个Perl脚本的开始。这些指令使perl能够捕获错误并警告某些可能的错误代码。作为一个初学者,你可能想要与warningsdiagnostics结合,以获得更详细的信息。

这些都非常方便,尤其是在开始使用Perl时,它们可以帮助您防止在脚下自我拍摄。

+0

谢谢分配。大括号被解释为散列。所以在声明数组时使用了大括号。 – Arianule

+0

没有问题:)我仍然在努力与Perl自己。请接受它是否解决您的问题。谢谢 – pcalcao

1

尝试:

@numbers = (1,4,5,6,7,8,9); 
foreach(@numbers) { 
    print $_; 
} 
+0

你有没有试过用原始海报的代码?为什么不?问题不在于循环语句,而在于变量的类型。 – Jens

+0

有两个问题。一个在循环中,一个在声明中。我的回答集中在循环和更短的替代方案。感谢评论,但我编辑了我的帖子! – interphase27

+0

'print $ _'是多余的。 – TLP

5

你在做什么有索引0创建一个哈希REF的阵列,即:

$numbers[0] = { 
    1 => 4, 
    5 => 6, 
    7 => 8, 
    9 => undef, 
}; 

如果您用过严格,你会看到:

Global symbol "@numbers" requires explicit package name 

和警告会告诉你:

Odd number of elements in anonymous hash 

启动所有的Perl脚本的东西,如:

#!/usr/bin/perl -w 
use strict; 

(或者use warnings;),你会总是能够捕获这些类型的错误的时候了。即使经验丰富的Perl程序员也会时不时地做出来。真的没有任何理由让他们离开(除非你打高尔夫球)。

+2

+1 *当电脑可以告诉你*时,不要问百万人。 '严格使用;使用警告;' –

+0

看起来像某人可能已经阅读http://stackoverflow.com/q/8023959/725418毕竟。 =) – TLP