配列への参照を、実行できると理解しているさまざまな方法で使用しようとしています。
これが私の試練の1つです:-
my $RoR = [[2, 3], [4, 5, 7]];
my @AoA = ([2, 3], [[2, 3], [4, 5, 7]]);
my @AwR = ([2, 3], @{$RoR});
print $AoA[1][1][1], "\n"; # 1
print $AoA[1]->[1][1], "\n"; # 2
#print $RoR[0][1], "\n"; # 3
print $RoR->[0][1], "\n"; # 4
print $AwR[1][1][1], "\n"; # 5
print $AwR[1]->[1][1], "\n"; # 6
ご覧のとおり、3つの異なるアレイがあります。
$RoR
->2つの匿名配列を含む匿名配列への参照です@AoA
->2つの匿名配列を含む配列です。2番目の匿名配列は、参照が指す配列と同じです。$RoR
@AwR
->とほぼ同じです@AoA
が、新しい匿名配列を使用するのではなく、参照@{$RoR}
自体をその中に追加した点が異なります。つまり、基本的に、最後の2つの配列は実質的に同じだと思います。
さて、問題は、彼らが同じように振る舞っていないということです。
printステートメント
1
、および2
は正常に機能しており5
、結果として値を出力します。printステートメント
3
でエラーが発生しますが、その理由はわかっているので、問題はありません。printステートメント4
は、期待どおりに値を出力3
しています。さて、プログラムを実行しようとすると、printステートメント
5
と6
いくつかのエラーがスローされます。"Can't use string ("2") as an ARRAY ref while \"strict refs\" in use at D:/_Perl Practice/3perldsc/array_of_array.pl line 15."
それから私は使ってみました:-
print $AwR[1][1]->[1], "\n";
print @{$RoR}[1]->[1];
$AwR[1]
ここで@{$RoR}
、を$AwR[1]
含むように、に置き換えました@{$RoR}
。2つ目は正常に動作していますが、1つ目はまだエラーをスローしています。
1st two
では、とlast two
printステートメントの違いは正確には何ですか?それらは同じだと思ったので、同じインデックスアクセスに対して同じ結果が得られるはずです。そうではありません。参照を間違った方法で使用していますか?
さて、今、疑いの余地は明らかです。そこで、この質問に関連する一般的な内容をまとめた回答を投稿しました。下記をご覧ください。その中で、私は印刷ステートメントに疑問を持ってい5th and 6th
ます、そしてそれを理解するために私は以下のテストを試みました:-
print $AwR[1][1]; # Allowed as `$AwR[1]` is same as `$$RoR`.
print $$RoR[1]; # Allowed as in 3(b)
print $AwR[1]->[1]; # Confused here. It is allowed
print $$RoR->[1]; # But this is not.
最初の3つのステートメントは同じを出力していreference value
ます。しかし、最後のものは失敗しています。したがって、:-$AwR[1]
は。と同じであることを確認してください$$RoR
。しかし、なぜ$$RoR->[1]
働いている間$AwR[1]->[1]
に働いていないのですか?それは私にこのエラーを投げています:-
Not a SCALAR reference at D:/_Perl Practice/3perldsc/array_of_array.pl line 24.
それで、2つの異なる方法でそれを使用することの違いは何ですか?