• ベストアンサー

どんなデータ構造になっているのでしょうか

perl -de 1 DB<1> for $i (0..2) { for $j (0..2) { $t[$i]->[$j] = 999 } } DB<2> @t = (1,1,1); DB<3> x $t[0] 0 1 DB<4> x $t[0]->[0] 0 undef この結果は分かるような気がするのですが、順序を逆にすると perl -de 1 DB<1> @t = (1,1,1); DB<2> for $i (0..2) { for $j (0..2) { $t[$i]->[$j] = 999 } } DB<3> x $t[0] 0 1 DB<4> x $t[0]->[0] 0 999 となります。このとき、$t[0]->[0] はどんな構造になってるのでしょうか。

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

  • ベストアンサー
回答No.2

すいません、僕もまだよく分かってませんが。。。 use strict; use warnings; を付けて実行すると Can't use string ("1") as an ARRAY ref while "strict refs" in use at test.pl line 15. と表示されたので、多分これはシンボリックリファレンスが原因のような気がします。

参考URL:
http://okwave.jp/qa1832934.html

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

すみません, 別の質問を見ていて, こちらを完全に無視していたことに気付きました. ごめんなさい. そっちの質問でちょっと調べたのですが, #3 の解釈でおそらく正解だと思います. どうも 1->[0] を $1[0] と解釈しているようです. あれ? 手元の ActivePerl では main:: に 1 が存在する.... そりゃそうか, :: と main:: は同じだもんなぁ. しまった, あっちにもフォロー入れとかないと....

t-okura
質問者

お礼

やっぱりシンボリックリファレンスですよね。 あれからシンボリックリファレンスについて調べています。 まだ、不明なところが多いのですが、本質問はクローズさせていただきます。 回答ありがとうございました。

回答No.3

use strict; use warnings; my @t = (1, 2, 3); no strict 'refs'; for my $i (0..2) {   for my $j (0..2) {     # 1->[$j] と解釈されている?     $t[$i]->[$j] = 999;   } } print 1->[0]; # => 999 1->[0]がコンパイルが通ってしまうことに驚きですが。。。 どうやらこう解釈されているようです。 %main::のシンボルテーブルを見ても$main::1なるものはありませんでした。

t-okura
質問者

お礼

う~む。よくわからない。シンボリックリンクではないということでしょうか。 どうもこの質問はわたしの能力の範囲を越えていたようです。 それでも正解は得られたようなので、いただいた答えをじっくりと考えてみます。 ありがとうございました。 もう二三日してから締め切ってお礼を出させていただきます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

$t[0]->[0] はただのスカラですが.... $t[0] は配列のリファレンス.

t-okura
質問者

補足

回答ありがとうございます。 $t[0] が配列のリファレンスだとデバッガでの x $t[0] は DB<2> x $t[0] 0 ARRAY(0x8a77834) 0 999 1 999 2 999 のように表示されると思うのですが、 DB<3> x $t[0] 0 1 と表示されます。この表示からは $t[0] はスカラーの 1 に見えますが、 DB<4> x $t[0]->[0] 0 999 のようにスカラーの 1 が指す先にデータが入っています。 $t[0] としたときと $t[0]->[0] としたときとで、$t[0] の内容が 違っているように見えます。 また、$t[0] に値をセットした後、$t[0]->[0] に値をセットしても $t[0] の値は保持されていますが、$t[0]->[0] に値をセットした後 $t[0] に値をセットすると $t[0]->[0] が参照できなくなります。 この点も不思議に感じるところです。 $t[0] に入っているデータは、どのようになっているのでしょうか。