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

他の人は、日の配列を反復する方法に関する質問に答えましたが、月を正しい順序で印刷する際の問題は、ハッシュが順序付けられていないことです。これには2つの解決策があります。

1 つ目は、次のように手動で月のキーを反復処理することです。

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

あなたの質問には答えられていません - 私が間違っていなければ....あなたが見ている「ゴミ」はデータではありませんが、それが何であるかを示しています。ハッシュキーに割り当てます。

したがって、コードを取得すると、次のようになります。

#!/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 に答える
0

あなたは何をしようとしているのですか?月の名前を出力したい場合は、ループする必要がありますkeys %Quarter。キーと値をペアにする場合は、 を使用しますeach。このように配列コンテキストでハッシュを使用すると、すべてのキーすべての値が取得されます。

foreach my $month ( keys %Quarter ) {
        print "$month\n";
}
于 2012-09-05T11:10:24.863 に答える