
#お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか
#!/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で質問しましょう!
似たような質問が見つかりました
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Visual Basic(VBA) 型が一致しませんとエラー 6 2023/07/06 20:14
- JavaScript java keyを配列で表記したい 10 2022/12/01 17:53
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/02/07 09:58
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
GIFアニメをループさせたくない
-
ループの後判断どんな時使うの
-
範囲指定したセルを1つずつ飛...
-
ループフリー
-
一巡伝達関数と開ループ伝達関数
-
スリザーリンクの問題をランダ...
-
VBAのautofilter、criteriaの配...
-
UWSCのスクリプトで行き詰って...
-
CSVファイルの特定の行だけを読...
-
「偶数・奇数の和」のフローチ...
-
ダイアログのテキストにマウス...
-
UWSCに制限時間を付けたいです
-
乱数の桁数指定、または範囲指定。
-
VBScript 配列
-
C言語について。
-
vb.netです。2次元配列の要素を...
-
UWSCの終了の仕方
-
サブルーチンの戻り値
-
perlで2次元配列をサブルーチ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
チェックデジットについて
-
列挙型と連想配列の違いを教え...
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
ハッシュ値によるファイルの同...
-
ハッシュ値が一致したデータは...
-
Perlは戻り値で、ハッシュや配...
-
まったく同じファイルのハッシ...
-
ハッシュとツリー構造
-
短いハッシュの作り方
-
*(アスタリスク)の意味
-
アンカークリックで2ヶ所のリ...
-
一意(ユニーク)かつ、ソート...
-
Perl初心者ですが
-
英語でのシャープとコメの呼び...
-
VBAにハッシュ関数はないのです...
-
Perlのサブルーチンの引数に配...
-
rubyであるサイトのデータを自...
-
サブルーチンの引数としてハッ...
-
ハッシュにおける値の取り出し
おすすめ情報