• ベストアンサー

動的なハッシュの配列を作成したい

#お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか #!/usr/bin/perl #想定される配列 @array=(0,2,4,6,8,1,3,5,7,9); #下記が最終的に動的に作成したいハッシュの形です。 %List = ( '0' => [ (@array0_n) ], '2' => [ (@array2_n) ], '4' => [ (@array4_n) ], '6' => [ (@array6_n) ], '8' => [ (@array8_n) ], '1' => [ (@array1_n) ], '3' => [ (@array3_n) ], '5' => [ (@array5_n) ], '7' => [ (@array7_n) ], '9' => [ (@array9_n) ], ); $a='array'; $n='_n'; foreach (@array){ #試行錯誤中... print "\@{${a}[$_]{$n}}=@{${a}[$_]{$n}}"; } __END__; お忙しいかとは存じますが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nerumako
  • ベストアンサー率84% (11/13)
回答No.3

ざっと見たところ、リファレンスを使われたいのではないでしょうか。 それと、「最終的に動的に作成したいハッシュ」の%Listについては '0' => [ (@array0_n) ], と書かれている通り各keyに対してのvalueは配列が入る事になりますので @array0_n~@array9_nの要素はハッシュ作成の処理を行う前に用意しなくてはなりませんね。 と、勝手に仮定しまして下記処理を書いてみました。 #--------------------------------------------------- @array=(0,2,4,6,8,1,3,5,7,9); ### 勝手に要素を用意しました @array0_n=('a','b','c'); @array2_n=('d','e','f'); @array4_n=('g','h','i'); @array6_n=('j','k','l'); @array8_n=('m','n','o'); @array1_n=('p','q','r'); @array3_n=('s','t','u'); @array5_n=('v','w','x'); @array7_n=('y','z','aa'); @array9_n=('ab','ac','ad'); foreach(@array){ my $x="array$_\_n"; $List{$_}=[(@$x)]; print "@$x<br>"; } #--------------------------------------------------- @arrayの要素番号0~ をハッシュのkeyとして、 valueを(@array要素番号_n)と言う配列名として、 実質、配列要素の順番にハッシュを作成した事になります。 もちろんハッシュを作成する順番の事であって、他の方が言われる通りハッシュのkey,valueの並び順を保障するモノではありません。 #下記が最終的に動的に作成したいハッシュの形です。 結果的に↑になっているのではないでしょうか。 ハッシュに対してシンボリックリファレンスを使って動的に配列を入れてます。(まずいですか?) ご存知かとは思いますが%Listの各要素を確認するには print $List{0}[1]; とかになります。 ちょっと質問の情報量が少なめなので ほとんど推理に近い憶測で書いてみました。

taku0
質問者

お礼

>それと、「最終的に動的に作成したいハッシュ」の%Listについては >'0' => [ (@array0_n) ], >と書かれている通り各keyに対してのvalueは配列が入る事になりますので >@array0_n~@array9_nの要素はハッシュ作成の処理を行う前に用意しなくてはなりませんね。 仰る通りです。これは前もって用意されている前提でございました。 >@arrayの要素番号0~ をハッシュのkeyとして、 >valueを(@array要素番号_n)と言う配列名として、 >実質、配列要素の順番にハッシュを作成した事になります。 > >ハッシュに対してシンボリックリファレンスを使って動的に配列を入れてます。(まずいですか?) ありがとうございます。まさしく! >foreach(@array){ >my $x="array$_\_n";#array$_\_nを代入するんですね。 >$List{$_}=[(@$x)];#そして、リファレンスにする為に[]でくくって配列を展開させる為に(でくくるっていう事なんでしょうか・・。この辺りがどうにも分からない部分でいつも試行錯誤してしまう部分です。) > >print "@$x<br>"; >%Listの各要素を確認するには >print $List{0}[1]; >とかになります。 ですね。$List{0}・・・?と一瞬思うんですが、キーが数字ですので、そうなるんですよね。 情報=前提少なめですいませんでした。 ありがとうございました。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

[...] は配列リファレンスを作りますぜ>#4. ついでにいうと中に対して配列コンテキストを要求します. つまり [@{$x}] は $x を (シンボリック) リファレンスとする配列の中身をそのまま持つような配列リファレンスを作ります. [...] が配列コンテキストを要求するのがポイントで, そうじゃない (つまりスカラコンテキストだ) と @{$x} が「要素数」に変換されてしまいます. で, 今の場合の () は完全にオプショナルです. [...] が配列コンテキストを要求しているので中の (@{$x}) は配列コンテキストで評価されますが, その場合 () は単に冗長なだけです.

taku0
質問者

お礼

実に分かり易い詳細な補足説明ありがとうございます。

  • nerumako
  • ベストアンサー率84% (11/13)
回答No.4

>my $x="array$_\_n";#array$_\_nを代入するんですね。 その通りです。 >$List{$_}=[(@$x)];#そして、リファレンスにする為に[]でくくって配列を展開させる為に(でくくるっていう事なんでしょうか・・。この辺りがどうにも分からない部分でいつも試行錯誤してしまう部分です。) > 2つ違います。  × リファレンスにする為に[]でくくって  × 配列を展開させる為に(でくくる $List{$_} はハッシュの入れ子です。$List{key}に対して配列 @$xを代入しています。 以下は同じ意味を持ちます。 %List = ('key' => 'value'); $List{key}='value'; ↑後者のようにスカラーに代入するようにハッシュを作れます。 ハッシュなんて言っても本当の正体は$スカラーなんです。配列もしかり。 それと @$xは$xに代入した文字列「array数字_n」を無理やり配列名に解決してしまっているようなものでそれ自体がシンボリックリファレンスらしいです。私は普段まったく使いません。 >配列を展開させる為に(でくくる () でくくるのは質問のソースに記述してあったのでノリでそのまま付けました。 配列を展開させるのではなく、配列を格納するためです。 配列格納の印として[]を用います。今回のように変数を入れる場合は()が無くて良いです。あっても動きますので結構適当です。 似たような記号だらけで本当いやになっちゃいますよね。 オマケにもうひとつ  × この辺りがどうにも分からない部分で 作り手が解らない部分があったままのスクリプトを動かすのでは コンピューターが困りますよね。 そのまま共用サーバーなどにスクリプトをアップするのであれば 路上で操作方法が解らないのに車を運転しているのと同じように危ないですから注意したいですよね。 解らない部分はとことん調べましょう。どんどん聞いても良いです。 今回はハッシュが多次元化してしまっていますが、 配列、ハッシュの基本操作を覚えてしまえば全然問題ないと思います。

taku0
質問者

お礼

お返事遅くなりました。 改めて色々とご教授頂いている事、感謝いたします。 ありがとうございます。

  • pick52
  • ベストアンサー率35% (166/466)
回答No.2

ハッシュというのはPerlで連想配列を実装するために使用されている アルゴリズムの名前です。 ハッシュは順番を固定せずにコンピュータが扱いやすいように自動で 内部的にソートしてしまうので順番を保持できません。 ハッシュは高速に動作するので連想配列に実装によく利用されていますが ハッシュそのものは連想配列だけのものでもないし連想配列の実装の アルゴリズムもハッシュのみではありません。 http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0 で、Perlの連想配列で順番を固定したい場合は Tie::IxHash という モジュールを使用します。 http://katsubemakito.net/cgiperl/variable/hash/post-46.html

taku0
質問者

お礼

Tie::IxHash というのがあるんですか、ご教授頂きありがとうございます。 ハッシュのキーに順番付けができるんですね。何だか面白そうです。 少し試行錯誤してみたいと存じます。 ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ハッシュではキーと値の対応関係のみが重要であって, 「キー (や値) の順番」は意味を持ちません. つまり, 例えば my %a = (a => 'x', b => 'y'); my %b = (b => 'y', a => 'x'); とやると %a と %b は同じ内容のハッシュになります. なので, 「配列の順番にハッシュを作る」と言われても「それはどういうことでしょうか?」となります. あとついでに @array0_n とかって, 何を意味するんでしょうか?

taku0
質問者

お礼

ご教授頂きありがとうございます。 >「キー (や値) の順番」は意味を持ちません に意味を持たせられないか・・・と言うのが出発点でしたので、今回配列の順番にハッシュを作りたかったのでございます。 意味を持たせてどうしたいのか・・・部分につきましては、上記のお方に参考URLを掲示して頂いておりますのでそれを参考に少し試行錯誤してみようかと存じます。 @array0_nの意味は、配列を管理する為にn?とnの後ろに数字をつけている為でございました。

関連するQ&A