こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ハッシュの中に格納された配列の要素数を得る方法

予想配列のあるキーを配列とします。
%hash;
@hash{'a'}=['aa','ab','ac'];

一方で普通の配列をスカラ変数として扱うと配列数を表します。
@array=(a,b,c,d,e);
$num=@array;# $numは5になる。

それでは
$num=@hash{'a};
あるいは
 $num=@{hash{'a'}};
としたらどうなるのって
ARRAY(0x2438c4)
みたいになって、$numに@hash{'a'}の要素数は入りません。

予想配列の中に格納された配列の要素数を取り出す簡便な方法はないものでしょうか。

お手数をお掛けします。

投稿日時 - 2009-05-12 21:56:47

QNo.4953703

困ってます

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

えっと、まず予想配列じゃなくて連想配列ですね。

まず、ハッシュのキーに対し配列自身を格納することはできません。
たぶん、配列を入れたいので@をつけられたのだと思いますがこれはこれで別の意味になってしまいます。
では、どうすればよいかと言いますと、配列自身の代わりに、
データーの保存されている場所(Cで言うとこのポインターの考え)を
格納することなら可能です。
リファレンスと呼ばれている物です。
リファレンスは、あくまでもデータの保存場所情報なので実際に配列の要素数を知りたいとなるとデリファレンスが必要です。

質問者様のコードを、文法に沿って解釈すると
%hash; #ハッシュを用意する
@hash{'a'}=['aa','ab','ac']; #ハッシュのスライス(左辺)に配列のリファレンス(右辺)を格納する。本来右辺はリストを期待している。
$num=@hash{'a'}; #右辺はハッシュのスライス。リストのうち一番最後の要素が左辺に格納される。ここでは配列のリファレンス

といった感じです。
ただしくは、
%hash;
$hash{'a'} = ['aa', 'ab', 'ac'];
$num = @{$hash{'a'}};
print $num, "\n"; #3と表示される

2行目の$hash{'a'}は、配列の保存場所というスカラー(単一)
データを格納しているの$が正解となります。
そして、3行目の@{ $hash{'a'} } でリファレンス(保存場所の情報)から
実際のデータ(ここでは配列)にするためにデリファレンスを行っています。

投稿日時 - 2009-05-12 23:31:31

お礼

どうもありがとうございます。
長らく放置して申し訳ありませんでした。

投稿日時 - 2009-10-19 16:57:56

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

誤> 予想配列
正> 連想配列またはハッシュ

誤> @hash{'a'}=['aa','ab','ac']; # この間違いが、最後の結果を不可解にしてる
正> $hash{'a'}=['aa','ab','ac']; # ハッシュ要素に配列を入れる

ちなみに、 @hash{'a1', 'a2', 'a3'} の書式はハッシュスライスと言って、 ($hash{'a1'}, $hash{'a2'}, $hash{'a3'}) と等価です。 同様に、@hash{'a'} は ($hash{'a'}) という 要素数1 の配列です。


誤> $num=@hash{'a};
誤> $num=@{hash{'a'}}; # おしい。
正> $num=@{$hash{'a'}}; # ハッシュ要素に入った配列の要素数

投稿日時 - 2009-05-12 23:41:15

お礼

どうもありがとうございます。
長らく放置して申し訳ありませんでした。

投稿日時 - 2009-10-19 16:58:33

あなたにオススメの質問