我正在尝试从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 :(得分:3)
在Perl中,哈希可以简单地转换为具有相同数量元素的数组。每个偶数元素是一个键,后面的(奇数编号)元素是相应的值。
现在,foreach
是一个迭代数组而不是哈希的运算符。因此,您的代码执行的操作:循环变量迭代键,值,下一个键,下一个值等。
您可以通过多种方式迭代哈希:
while (my ($key, $value) = each %hash) { ... }
foreach my $key (keys %hash) { ... }
foreach my $value (values %hash) { ... }
答案 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";
}
}