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)

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

谢谢

4

5 回答 5

3

在 Perl 中,散列可以很容易地转换为具有相同数量元素的数组。每个偶数元素是一个键,后面的(奇数)元素是对应的值。

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

有几种方法可以迭代哈希:

  1. 遍历所有键/值对。你通常会这样做while (my ($key, $value) = each %hash) { ... }
  2. 从哈希中检索所有键并遍历它们:foreach my $key (keys %hash) { ... }
  3. 如果您不需要键而只需要值,那么您还可以从哈希中获取所有值并使用foreach my $value (values %hash) { ... }
于 2012-09-05T11:14:48.487 回答
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}};
}

蒂姆托迪!希望有帮助。:)

于 2012-09-05T12:01:23.877 回答
1

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

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

或者

foreach my $month (keys %Quarter ) {
    print "$_\n" for @{$Quarter{$month}};
}
于 2012-09-05T11:10:03.723 回答
0

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

foreach my $month ( keys %Quarter ) {
        print "$month\n";
}
于 2012-09-05T11:10:24.863 回答
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";
  }
}
于 2012-09-05T20:34:35.627 回答