2012-09-05 104 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"; 
    } 
}