#お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか
#!/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__;
お忙しいかとは存じますが、よろしくお願いいたします。
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];
とかになります。
ちょっと質問の情報量が少なめなので
ほとんど推理に近い憶測で書いてみました。
>それと、「最終的に動的に作成したいハッシュ」の%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}・・・?と一瞬思うんですが、キーが数字ですので、そうなるんですよね。
情報=前提少なめですいませんでした。
ありがとうございました。
No.5
- 回答日時:
[...] は配列リファレンスを作りますぜ>#4. ついでにいうと中に対して配列コンテキストを要求します. つまり
[@{$x}]
は $x を (シンボリック) リファレンスとする配列の中身をそのまま持つような配列リファレンスを作ります. [...] が配列コンテキストを要求するのがポイントで, そうじゃない (つまりスカラコンテキストだ) と @{$x} が「要素数」に変換されてしまいます.
で, 今の場合の () は完全にオプショナルです. [...] が配列コンテキストを要求しているので中の (@{$x}) は配列コンテキストで評価されますが, その場合 () は単に冗長なだけです.
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」を無理やり配列名に解決してしまっているようなものでそれ自体がシンボリックリファレンスらしいです。私は普段まったく使いません。
>配列を展開させる為に(でくくる
() でくくるのは質問のソースに記述してあったのでノリでそのまま付けました。
配列を展開させるのではなく、配列を格納するためです。
配列格納の印として[]を用います。今回のように変数を入れる場合は()が無くて良いです。あっても動きますので結構適当です。
似たような記号だらけで本当いやになっちゃいますよね。
オマケにもうひとつ
× この辺りがどうにも分からない部分で
作り手が解らない部分があったままのスクリプトを動かすのでは
コンピューターが困りますよね。
そのまま共用サーバーなどにスクリプトをアップするのであれば
路上で操作方法が解らないのに車を運転しているのと同じように危ないですから注意したいですよね。
解らない部分はとことん調べましょう。どんどん聞いても良いです。
今回はハッシュが多次元化してしまっていますが、
配列、ハッシュの基本操作を覚えてしまえば全然問題ないと思います。
No.2
- 回答日時:
ハッシュというのはPerlで連想配列を実装するために使用されている
アルゴリズムの名前です。
ハッシュは順番を固定せずにコンピュータが扱いやすいように自動で
内部的にソートしてしまうので順番を保持できません。
ハッシュは高速に動作するので連想配列に実装によく利用されていますが
ハッシュそのものは連想配列だけのものでもないし連想配列の実装の
アルゴリズムもハッシュのみではありません。
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83% …
で、Perlの連想配列で順番を固定したい場合は Tie::IxHash という
モジュールを使用します。
http://katsubemakito.net/cgiperl/variable/hash/p …
Tie::IxHash というのがあるんですか、ご教授頂きありがとうございます。
ハッシュのキーに順番付けができるんですね。何だか面白そうです。
少し試行錯誤してみたいと存じます。
ありがとうございました。
No.1
- 回答日時:
ハッシュではキーと値の対応関係のみが重要であって, 「キー (や値) の順番」は意味を持ちません. つまり, 例えば
my %a = (a => 'x', b => 'y');
my %b = (b => 'y', a => 'x');
とやると %a と %b は同じ内容のハッシュになります. なので, 「配列の順番にハッシュを作る」と言われても「それはどういうことでしょうか?」となります.
あとついでに @array0_n とかって, 何を意味するんでしょうか?
ご教授頂きありがとうございます。
>「キー (や値) の順番」は意味を持ちません
に意味を持たせられないか・・・と言うのが出発点でしたので、今回配列の順番にハッシュを作りたかったのでございます。
意味を持たせてどうしたいのか・・・部分につきましては、上記のお方に参考URLを掲示して頂いておりますのでそれを参考に少し試行錯誤してみようかと存じます。
@array0_nの意味は、配列を管理する為にn?とnの後ろに数字をつけている為でございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像が表示でnull; this.src
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
アルファベットに付いて質問し...
-
Raspberry Pi
-
Perl 特定のフォルダ以外削除
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
チェックデジットについて
-
perl 文字列検索後に指定フィー...
-
perlで配列名を動的に作り出したい
-
列挙型と連想配列の違いを教え...
-
英語でのシャープとコメの呼び...
-
ハッシュのハッシュを実現したい。
-
動的なハッシュの配列を作成したい
-
多次元連想配列の削除
-
多次元配列から重複を削除
-
ハッシュリストって単にハッシ...
-
ハッシュ値が一致したデータは...
-
まったく同じファイルのハッシ...
-
*(アスタリスク)の意味
-
ハッシュマーク以降のアドレス取得
-
Perlのサブルーチンの引数に配...
-
UTF-8で書かれたJSPの日本語文...
-
連想配列のサイズ制限
-
Perlは戻り値で、ハッシュや配...
おすすめ情報