哈希的数组打印垃圾值

时间:2012-09-05 11:06:42

标签: arrays perl hash

我正在尝试从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)

知道这个程序出了什么问题。

由于

5 个答案:

答案 0 :(得分:3)

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

现在,foreach是一个迭代数组而不是哈希的运算符。因此,您的代码执行的操作:循环变量迭代键,值,下一个键,下一个值等。

您可以通过多种方式迭代哈希:

  1. 遍历所有键/值对。您通常会使用while (my ($key, $value) = each %hash) { ... }
  2. 之类的东西
  3. 从哈希中检索所有密钥并迭代这些密钥:foreach my $key (keys %hash) { ... }
  4. 如果您不需要密钥而只需要值,那么您也可以从哈希中获取所有值并迭代那些foreach my $value (values %hash) { ... }
  5. 的值

答案 1 :(得分: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!希望有所帮助。 :)

答案 2 :(得分:1)

在foreach循环中,$ month是对数组的引用,你必须这样做

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

你的问题还没有得到解答 - 如果我没有错......我会说,"垃圾"您所看到的不是数据,而是说它是什么,它是您分配给您的哈希键的匿名ARRAY。

所以接受你的代码应该是:

#!/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";
  }
}