Perlの連想配列の連想配列

[上に] [前に] [次に]
Yosh 2000/01/20(木) 23:14:38
ど〜も!
ちょっと奇怪な事を思いついて、Perlの連想配列の連想配列
を試してみました。ただいろいろ調べたけど、こんな事を解
説しているとこがないので、一体使い方として正しいのか、
分かりません。一応、動きました。Perlは基本的にVariant
型だから、こんな使い方もOKなのかなぁ。。。
OKだと、3次元連想配列なんてのも可能になるわな、

B-Cus 2000/01/20(木) 23:29:51
http://www.oreilly.co.jp/BOOK/pperl.htm に書いてあります。

Yosh 2000/01/21(金) 00:19:45
B-Cusさん、クイックレスポンス、どーもっす!

えっと、、手元にPerl4のNutsShellしかないので、そっから
いろいろ調べたら、あ〜るじゃないの!と思って試したけど
これでは、どーも役不足ですな。。。というのも、1次キー
と2次キーがあるとして、1次キーに属するデータがあるか
否かを調べたいのです(って始めから言えって?)。
検証した内容は下記です。

$array{'a'}{'b'}="datadata";
$array{'a'}{'b'}="datadata";
$array{'c'}{'d'}="datadata";

if ($array{'a'] eq '')
{
# 1次キー「a」に何も登録無し
}

ってな処理が一応動きました。このような使い方は
Perl5に実相されたのですかねぇ。。。何分Perl5は
本では未調査の為、わからず(検証時はPerl5)

B-Cus 2000/01/21(金) 00:48:08
$hash{b}{c} は $hash{b}->{c} と等価であり、さらに
${$hash{b}}{c} と等価です。

つまり $hash{b} の値 (value) はハッシュへのリファレンスであり
($hash{b} の値はポインタのようなものであるということ)、
$hash{b} をデリファレンスした %{$hash{b}} が $hash{b} の
指すデータ (ハッシュ) です。%{$hash{b}} はハッシュなので、
${$hash{b}}{c} は $hash{b} が指すハッシュの key=c の値 (value)
を表します。

なので、$hash{b}{c} も同じく、$hash{b} が指すハッシュの
key=c の値 (value) を表します。


> if ($array{'a'] eq '')
$array{'a'} は HASH(0xXXXX) という文字列を返すので eq でも
一応動きますが、推奨されるのは defined でしょう。

--スクリプト-----
$hash{b}{c}="1";
$hash{b}{d}="2";
$hash{e}->{f}="3";
${$hash{g}}{h}="4";

foreach $key1 ( keys %hash ){
  print "\$hash{$key1}=$hash{$key1}\n";
  foreach $key2 ( keys %{$hash{$key1}} ){
    print "  \$hash{$key1}{$key2} = $hash{$key1}{$key2}\n";
  }
}
--実行結果------
$hash{b}=HASH(0x74e4c)
  $hash{b}{c} = 1
  $hash{b}{d} = 2
$hash{e}=HASH(0x776b4)
  $hash{e}{f} = 3
$hash{g}=HASH(0x776d8)
  $hash{g}{h} = 4

----------------
この文章の目的は、
 「この場でリファレンスの全てを解説するのは
  無理なので、本を買って読んだ方がよい」
ということを実感してもらうことです :-)

# ま、多次元ハッシュとしてだけ使う分には
# リファレンスは知らなくてもいいかもしれませんけど。

Yosh 2000/01/21(金) 23:11:15
B−Cusさんどーもありがとーっす!
使い方は間違ってないと確認出来たので、
解決!しちゃいます!でも、本屋で少し見てみんべ、、Perl5を

Yosh 2000/01/21(金) 23:11:35
[[解決]]
あ、解決忘れた

[上に] [前に] [次に]