- ベストアンサー
どんなデータ構造になっているのでしょうか
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] はどんな構造になってるのでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
すいません、僕もまだよく分かってませんが。。。 use strict; use warnings; を付けて実行すると Can't use string ("1") as an ARRAY ref while "strict refs" in use at test.pl line 15. と表示されたので、多分これはシンボリックリファレンスが原因のような気がします。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
すみません, 別の質問を見ていて, こちらを完全に無視していたことに気付きました. ごめんなさい. そっちの質問でちょっと調べたのですが, #3 の解釈でおそらく正解だと思います. どうも 1->[0] を $1[0] と解釈しているようです. あれ? 手元の ActivePerl では main:: に 1 が存在する.... そりゃそうか, :: と main:: は同じだもんなぁ. しまった, あっちにもフォロー入れとかないと....
- kirikirkaz
- ベストアンサー率60% (21/35)
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なるものはありませんでした。
お礼
う~む。よくわからない。シンボリックリンクではないということでしょうか。 どうもこの質問はわたしの能力の範囲を越えていたようです。 それでも正解は得られたようなので、いただいた答えをじっくりと考えてみます。 ありがとうございました。 もう二三日してから締め切ってお礼を出させていただきます。
- Tacosan
- ベストアンサー率23% (3656/15482)
$t[0]->[0] はただのスカラですが.... $t[0] は配列のリファレンス.
補足
回答ありがとうございます。 $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] に入っているデータは、どのようになっているのでしょうか。
お礼
やっぱりシンボリックリファレンスですよね。 あれからシンボリックリファレンスについて調べています。 まだ、不明なところが多いのですが、本質問はクローズさせていただきます。 回答ありがとうございました。