2016-07-29 8 views
1

を渡すこれはあなたのために非常に単純なものかもしれませんが、私は一時間以上のためにそれをしようとしています。Perlのforeachループからサブルーチンへのハッシュリファレンス(ハッシュの配列)

[OK]を..ここで$行が本当にハッシュである私のコードは、

@collection = [ 
{ 
      'name' => 'Flo', 
      'model' => '23423', 
      'type' => 'Associate', 
      'id' => '1-23928-2392', 
      'age' => '23', 
}, 
{ 
      'name' => 'Flo1', 
      'model' => '23424', 
      'type' => 'Associate2', 
      'id' => '1-23928-23922', 
      'age' => '25', 
}]; 

foreach my $row (@collection) { 
    $build_status = $self->build_config($row); 
} 

sub build_config { 
    my $self = shift; 
    my %collect_rows = @_; 
    #my %collect_rows = shift; 

    print Dumper %collect_rows; exit; 
    exit; 
} 

です。私はそれを印刷するときしかし...それは以下のような出力(Iは、ダンパーを使用しています)、

$VAR1 = 'HASH(0x20a1d68)'; 
+0

私はあなたが本当に '@collection =(...)'ではなく '@collection = [...]'を持っていると思います。さもなければ '$ VAR1 = 'ARRAY(0x20a1d68)';'のようなものが得られます。 – ThisSuitIsBlackNot

+0

ha ..それらの違いは何ですか? (...)はハッシュ用、[...]は配列用です。私は正しい? @collection = [...]のように宣言されているためです。 – Raja

答えて

5

あなたはハッシュと配列との混乱の参照があるを提供します。ハッシュと配列の両方が単に一覧表示されているので、だ

my %hash = (1 => 2, 3 => 4); 

(空想リストが、私は話を戻そう):ハッシュを使用して宣言され

my @array = (1, 2, 3); 

配列

を使用して宣言されます。 []{}を使用する必要があるのは、リストに含まれている値を使用する場合、または両方のリストの参照を作成する場合(さらに下の方)のみです。 =>は、彼らが同じことを行うものの、 %h = (a, 1)が壊れるので、正常に動作します %h = ("a", 1)、左側を引用し、かつので %h = (a => 1)も正常に動作だけで、特別な(すなわち脂肪)、カンマ、であることを

注意aは引用されます。

配列参照は、そのように宣言されています

my $aref = [1, 2, 3]; 

...あなたはスカラーに配列リファレンスを配置する必要があることに注意してください。そうしないと、このようにそれを行う場合:

my @array = [1, 2, 3]; 

...参照は、あなたが望むものはおそらくない@arrayの最初の要素、にプッシュされます。

ハッシュリファレンスは、次のように宣言されている::

my $href = {a => 1, b => 2}; 

[]は、アレイ(ないAREF)で使用されている唯一の時間あなたは要素を使用するためにそれを使用しているときです。ハッシュと同様に、参照でない限り、{}を使用してキーの値を取得します($hash{a})。

今、あなたの問題を解決するために、あなたはこれらの変更と参照使い続けることができます。

use warnings; 
use strict; 

use Data::Dumper; 

# declare an array ref with a list of hrefs 

my $collection = [ 
    { 
     'name' => 'Flo', 
     ... 
    }, 
    { 
     'name' => 'Flo1', 
     ... 
    } 
]; 

# dereference $collection with the "circumfix" operator, @{} 
# ...note that $row will always be an href (see bottom of post) 

foreach my $row (@{ $collection }) { 
    my $build_status = build_config($row); 
    print Dumper $build_status; 
} 

sub build_config { 
    # shift, as we're only accepting a single param... 
    # the $row href 

    my $collect_rows = shift; 
    return $collect_rows; 
} 

を...または非レフリーを使用するようにそれを変更します。

my @collection = (
    { 
     'name' => 'Flo', 
     ... 
    }, 
    { 
     'name' => 'Flo1', 
     ... 
    } 
); 

foreach my $row (@collection) { 
    my $build_status = build_config($row); 

    # build_config() accepts a single href ($row) 
    # and in this case, returns an href as well 

    print Dumper $build_status; 
} 

sub build_config { 
    # we've been passed in a single href ($row) 

    my $row = shift; 

    # return an href as a scalar 

    return $row; 
} 

私が書きましたPerlのリファレンスに関するチュートリアルはguide to Perl referencesに興味があります。 perlreftutもあります。

一つの最後の点、彼らは確かにハッシュ参照ですので...ハッシュは、配列の{}内部で宣言されています。多次元データでは、Perlの構造の最上位レベルのみが複数の値を含むことができます。その下にあるものはすべてスカラー値でなければなりません。したがって、ハッシュの配列を持つことはできますが、技術的にも文字通り、その値が別の構造体へのポインタ(参照)であるスカラーを含む配列です。ポインタ/参照は単一の値です。

+2

すばらしい...ありがとう! – Raja

+0

大歓迎です。 – stevieb

+0

は、私が詳細に説明しない質問の一部ではなかったので、助けてくれることを願っています。これは言うでしょう...配列やハッシュを渡すときのように、 perlは単にポインタを送るのではなく、構造のコピーを作る必要があります。参考文献で作業するときは、元の構造で作業します。実際の変数を送信する場合は、コピーを作成する必要がある場合です。そのため、元の構造は必要な作業で変更されません。 – stevieb

関連する問題