2017-01-19 3 views
0

私が解決できた私のperlスクリプトの障害に遭遇しましたが、なぜそれがそのように機能するのかは分かりません働く私はインターネットを精練してきましたが、適切な説明は見つかりませんでした。x参照数xデータ構造の数x

私は配列のハッシュへの参照を返すサブルーチンを持っています。ハッシュキーは単純な文字列であり、値は配列への参照です。私は、キー&値をプリントアウトすることができていますが

は、私は本当にライン3の背後にある構文を理解していない、この

for my $job_name (keys %$build_numbers) { 
    print "$job_name => "; 
    my @array = @{@$build_numbers{$job_name}}; # line 3 
    for my $item (@array) { 
     print "$item \n"; 
    } 
} 

のように、各キーに関連付けられた配列の要素をプリントアウトします。値人口の配列への参照であるハッシュへ

リファレンスを次のよう

我々のデータ構造です。

配列の要素を抽出するには、以下を行う必要があります。 - キーにアクセスできるようにハッシュリファレンスを逆参照します。 - 要素を抽出するキーに関連付けられた配列参照を逆参照します。

最後の質問のビーイング:

  • 配列などのハッシュのperlのハッシュを扱います。それぞれのデータ構造「ツリー」の「最下位」の要素を抽出するために、各レベルを逆参照して元のデータ構造に到達しなければなりません。

誰かが明確にすることでうまくいけばいいと思います。

+1

実際の質問はここではわかりませんが、回答は[perldsc](http://perldoc.perl.org/perldsc.html) –

+1

を参照してください。ハッシュリファレンスからの引用を外してください。 '$ build_numbers-> {$ job_name} ''であれば、その値は配列参照、 '@ {$ build_numbers - > {$ job_name}}'で参照解除してください。優先ルールのために '@ {...}'にcurliesが必要です。あなたのコードの2番目の '@'は余分です。それが基本ですが、これを扱う方法はたくさんあります。はい、あなたは下に行くためにレベルを通過する必要があります、他にどのように?関連するドキュメントを読む必要があります。その後の人生ははるかに良いでしょう。 – zdim

+0

これは何らかの種類の解析されたコンテンツですか? XMLやJSONなどを解析するときは、通常、複雑なデータ構造になります。 – Sobrique

答えて

4

ライン3はハッシュリファレンスのsliceを取っていますが、通常は1つの要素をスライスしないでb)クリーンでより明白なので、あなたがしようとしていることを行うには非常に奇妙な方法ですコードを読みやすくするための構文。

あなたのデータは、このようなものに見える場合:

my $data = { 
    foo => [0 .. 9], 
    bar => ['A' .. 'F'], 
}; 

を次にあなたの例の正しいバージョンは次のようになります。

生成
for my $key (keys(%$data)) { 
    print "$key => "; 

    for my $val (@{$data->{$key}}) { 
     print "$val "; 
    } 

    print "\n"; 
} 

bar => A B C D E F 
foo => 0 1 2 3 4 5 6 7 8 9 

を私はあなたを理解していれば2番目の質問ですが、答えは複雑なデータ構造の正確な場所にアクセスできるということです正しい構文を使用します。例:

print "$data->{bar}->[4]\n"; 

Eを印刷します。

追加の推奨読書:データ構造を使用した作業perlrefperlreftut、およびperldsc

+0

私がそれを好きにしたのは、(あなたとcarlosnsの答えで使われている) - >表記法を使いたくないからです。しかし、より短い/より読みやすいバージョンを使いたいと思ったからです。 @ $ hash_ref {$ job}は@ {$ hash_ref - > {$ job}}と同じだと思いました。しかし、私がその記法を使用すると、私のプリントは配列自体のためのヘキサコードを返しますが、それは内容ではありません。それから、別の@ {}を追加してもう一度解凍しようとしましたが、今度は配列の内容を表示するように見えました。 実際にあなたのフォーマットは、私が動作すると判明したフォーマットよりもはっきりしています。 – sSmacKk

0

は、それが作られたかに応じて、難しいことができます。

私はあなたの「仕事」データ構造があるかどうかわからないのですが、まさにこの:

#!/usr/bin/env perl 

use strict; 
use warnings; 
use diagnostics; 


my $hash_ref = { 

job_one => [ 'one', 'two'], 
job_two => [ '1','2'], 

}; 

foreach my $job (keys %{$hash_ref}){ 

print " Job => $job\n"; 

my @array = @{$hash_ref->{$job}}; 

foreach my $item (@array) 
{ 

     print "Job: $job Item $item\n"; 
} 

} 

あなたが配列されているキーを反復処理するハッシュリファレンスを持っています。しかし、この配列の各項目は、別の参照または単純なスカラーかもしれません。

基本的にrefで作業したり、最初のループで行ったようにrefを取り消したりすることができます。

詳細については、hereを確認できるドキュメントがあります。

最後の質問のビーイング:だから、あなたの質問に答える

- 配列などのハッシュのperlのハッシュを扱う場合。それぞれのレベルを逆参照する必要がある データ構造「ツリー」の「下部」の要素を抽出するには、 の要素を得るまで、 が元のデータ構造に到達する必要がありますか?

それはあなたのデータ構造が作られたかに依存し、例えば値を取得するのは簡単だろうために、あなたはすでにあなたが探しているものを知っていれば:

%のcity_codes =(

をa => 1、b => 2、

)。

my $ value = $ city_codes {a};

複雑なデータ構造には複雑なコードが付いています。

+0

私は@ {$ hash_ref - > {$ job}}の配列を作成するために提案した構文を試してみました。私が使用したドキュメントでこの構文が使用されているのを見てきましたが、私は短いバージョンを使用しようとした - >と私のバージョンも動作します。 @ {@ $ build_numbers {$ job_name}}。 – sSmacKk

+0

だからそれは大丈夫です:-) – carlosn

関連する問題