2012-09-05 127 views
1

我试图从一个perl程序中的数组散列打印数据。 但它打印一些垃圾值与原始数据一起:散列值打印垃圾值的散列

#!/usr/bin/perl 

my %Quarter = (
       June => ["06/03/2012", "06/10/2012", "06/17/2012", "06/24/2012"], 
       July => ["07/01/2012", "07/08/2012", "07/15/2012", "07/22/2012"], 
       August => ["08/05/2012", "08/12/2012", "08/19/2012", "08/26/2012"], 
); 


foreach my $month (%Quarter) { 
     print "$month\n"; 
} 

输出:

July 
ARRAY(0x9281af8) 
June 
ARRAY(0x9281bdc) 
August 
ARRAY(0x929ade8) 

任何想法,在这个程序会出错。

感谢

+0

您的问题在这里和在下面的评论表示您一个新的Perl的。它可以帮助您阅读[Modern Perl](http://onyxneon.com/books/modern_perl/)书以获得Perl的良好背景。 –

回答

1

在foreach循环,$月份是一个数组的引用,你必须做

use Data::Dumper; 
print Dumper\%Quarter; 

foreach my $month (keys %Quarter) { 
    print "$_\n" for @{$Quarter{$month}}; 
} 
+0

不,打印: 07/01/2012 07/08/2012 07/15/2012 07/22/2012 06/03/2012 06/10/2012 06/17/2012 06/24/2012 2012年8月8日08/12/2012 08/19/2012 08/26/2012 – Ram

0

你到底想干什么?如果要打印月份名称,则需要循环使用keys %Quarter。如果您想要键和值配对,请使用each。如果您在像这样的数组上下文中使用散列,您将获得所有键值的所有值。

foreach my $month (keys %Quarter) { 
     print "$month\n"; 
} 
+0

是的,我只需要输出几个月....你能修改上面的代码 – Ram

+0

是的,这个工程!谢谢! – Ram

+0

而且它为什么以随机顺序打印?任何想法!!我想要它作为六月,七月,八月! 现在它打印七月,六月,八月 – Ram

3

在Perl中,散列可以简单地转换为具有相同数量元素的数组。每个偶数编号的元素都是一个键,下面的(奇数编号)元素是相应的值。

现在,foreach是一个遍历数组而不是哈希的运算符。因此,你的代码做它做什么了:键,值,下键,下一个值等循环变量迭代

有几种方法,使你可以遍历一个哈希:

  1. 遍历所有键/值对。你平时做的东西,如while (my ($key, $value) = each %hash) { ... }
  2. 检索哈希所有键和遍历这些:foreach my $key (keys %hash) { ... }
  3. 如果您不需要钥匙,只值那么你也可以从tetrieve哈希和迭代的所有值在那些foreach my $value (values %hash) { ... }
+0

谢谢.. 它的工作原理,但它为什么打印随机顺序?任何想法!!我想要它作为六月,七月,八月!现在它打印七月,六月,八月 – Ram

+0

在Perl哈希不保留它们的键的顺序(不像PHP例如)。 –

+0

无论如何,我可以得到它? – Ram

2

人回答了关于如何在一天阵列迭代的问题,但在正确的顺序打印个月的问题是,哈希是无序的。我有两个可能的解决方案。

第一个涉及遍历月键手动像这样:

foreach my $month_name (qw(June July August)) { 
    print $month_name . ': ' . join ', ' => @{$Quarter{$month_name}}; 
} 

,或者您需要提供的数据结构哈希的数组:

my @months = (
    {name => 'June', days => ["06/03/2012", "06/10/2012", "06/17/2012", "06/24/2012"]}, 
    # ... 
); 

foreach my $month (@months) { 
    print $month->{name} . ': ' . join ', ' => @{$month->{days}}; 
} 

TIMTOWTDI!希望有所帮助。 :)

+0

我在这里有点新,我希望可以回答部分问题。如果这是错误的,请纠正我。 – memowe

+1

这样做会很好。欢迎! –

+0

谢谢,@JoelBerger! :) – memowe

0

你的问题没有得到回答 - 如果我没有错......我会说,你看到的“垃圾”不是数据,但它说明了它是什么,它是您分配给您的散列键的匿名阵列。

所以把你的代码应该是:

#!/usr/bin/perl 

my %Quarter = (
      June => ["06/03/2012", "06/10/2012", "06/17/2012", "06/24/2012"], 
      July => ["07/01/2012", "07/08/2012", "07/15/2012", "07/22/2012"], 
      August => ["08/05/2012", "08/12/2012", "08/19/2012", "08/26/2012"], 
); 


#foreach my $month (%Quarter) { 
# print "$month\n"; 
#} 
while(my ($k,$v) = each %Quarter) { 
    foreach my $x (@$v) { 
    print $x."\n"; 
    } 
}