プロが教えるわが家の防犯対策術!

#お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか

#!/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__;

お忙しいかとは存じますが、よろしくお願いいたします。

A 回答 (5件)

ざっと見たところ、リファレンスを使われたいのではないでしょうか。


それと、「最終的に動的に作成したいハッシュ」の%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];
とかになります。

ちょっと質問の情報量が少なめなので
ほとんど推理に近い憶測で書いてみました。
    • good
    • 0
この回答へのお礼

>それと、「最終的に動的に作成したいハッシュ」の%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}・・・?と一瞬思うんですが、キーが数字ですので、そうなるんですよね。

情報=前提少なめですいませんでした。

ありがとうございました。

お礼日時:2008/08/12 14:07

[...] は配列リファレンスを作りますぜ>#4. ついでにいうと中に対して配列コンテキストを要求します. つまり


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

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

お礼日時:2008/08/20 15:27

>my $x="array$_\_n";#array$_\_nを代入するんですね。



その通りです。

>$List{$_}=[(@$x)];#そして、リファレンスにする為に[]でくくって配列を展開させる為に(でくくるっていう事なんでしょうか・・。この辺りがどうにも分からない部分でいつも試行錯誤してしまう部分です。)
>

2つ違います。

 × リファレンスにする為に[]でくくって
 × 配列を展開させる為に(でくくる

$List{$_} はハッシュの入れ子です。$List{key}に対して配列 @$xを代入しています。

以下は同じ意味を持ちます。

%List = ('key' => 'value');
$List{key}='value';

↑後者のようにスカラーに代入するようにハッシュを作れます。
ハッシュなんて言っても本当の正体は$スカラーなんです。配列もしかり。

それと
@$xは$xに代入した文字列「array数字_n」を無理やり配列名に解決してしまっているようなものでそれ自体がシンボリックリファレンスらしいです。私は普段まったく使いません。

>配列を展開させる為に(でくくる

() でくくるのは質問のソースに記述してあったのでノリでそのまま付けました。
配列を展開させるのではなく、配列を格納するためです。
配列格納の印として[]を用います。今回のように変数を入れる場合は()が無くて良いです。あっても動きますので結構適当です。
似たような記号だらけで本当いやになっちゃいますよね。

オマケにもうひとつ

 × この辺りがどうにも分からない部分で

作り手が解らない部分があったままのスクリプトを動かすのでは
コンピューターが困りますよね。
そのまま共用サーバーなどにスクリプトをアップするのであれば
路上で操作方法が解らないのに車を運転しているのと同じように危ないですから注意したいですよね。

解らない部分はとことん調べましょう。どんどん聞いても良いです。
今回はハッシュが多次元化してしまっていますが、
配列、ハッシュの基本操作を覚えてしまえば全然問題ないと思います。
    • good
    • 0
この回答へのお礼

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

ありがとうございます。

お礼日時:2008/08/20 15:23

ハッシュというのはPerlで連想配列を実装するために使用されている


アルゴリズムの名前です。
ハッシュは順番を固定せずにコンピュータが扱いやすいように自動で
内部的にソートしてしまうので順番を保持できません。
ハッシュは高速に動作するので連想配列に実装によく利用されていますが
ハッシュそのものは連想配列だけのものでもないし連想配列の実装の
アルゴリズムもハッシュのみではありません。

http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83% …

で、Perlの連想配列で順番を固定したい場合は Tie::IxHash という
モジュールを使用します。

http://katsubemakito.net/cgiperl/variable/hash/p …
    • good
    • 0
この回答へのお礼

Tie::IxHash というのがあるんですか、ご教授頂きありがとうございます。

ハッシュのキーに順番付けができるんですね。何だか面白そうです。
少し試行錯誤してみたいと存じます。

ありがとうございました。

お礼日時:2008/08/12 13:59

ハッシュではキーと値の対応関係のみが重要であって, 「キー (や値) の順番」は意味を持ちません. つまり, 例えば


my %a = (a => 'x', b => 'y');
my %b = (b => 'y', a => 'x');
とやると %a と %b は同じ内容のハッシュになります. なので, 「配列の順番にハッシュを作る」と言われても「それはどういうことでしょうか?」となります.
あとついでに @array0_n とかって, 何を意味するんでしょうか?
    • good
    • 0
この回答へのお礼

ご教授頂きありがとうございます。

>「キー (や値) の順番」は意味を持ちません

に意味を持たせられないか・・・と言うのが出発点でしたので、今回配列の順番にハッシュを作りたかったのでございます。
意味を持たせてどうしたいのか・・・部分につきましては、上記のお方に参考URLを掲示して頂いておりますのでそれを参考に少し試行錯誤してみようかと存じます。

@array0_nの意味は、配列を管理する為にn?とnの後ろに数字をつけている為でございました。

お礼日時:2008/08/12 13:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!