1

私は perl で書かれた2つのステートメントに従っています:

@m1 = ( [1,2,3],[4,5,6],[7,8,9] ); # It is an array of references.
$mr = [ [1,2,3],[4,5,6],[7,8,9] ]; # It is an anonymous array. $mr holds reference.

私がしようとするとprint

print "$m1[0][1]\n"; # this statement outputs: 2; that is expected.

print "$mr->[0][1]\n"; #this statement outputs: 2; that is expected.

print "$mr[0][1]\n"; #this statement doesn't output anything.

2番目と3番目のprintステートメントは同じだと思います。ただし、3 番目の print ステートメントでは何も出力しませんでした。

3 番目の print ステートメントの何が問題なのか、誰か教えてもらえますか?

4

4 に答える 4

6

これは簡単です。$mr参考です。したがって、を使用しArrow Operatorて逆参照します。

また、 を使用するuse warnings; use strict;と、次のような明らかなエラー メッセージが表示されます。

Global symbol "@mr" requires explicit package name
于 2013-07-11T07:49:37.303 に答える
3

$mr値がリストへの参照であるスカラー変数です。これはリストではなく、リストのように使用することはできません。矢印が参照するリストにアクセスするには、矢印が必要です。

しかし、待って$m1[0]ください、これもリストではなく、リストへの参照です。のようにインデックス間に矢印を書く必要がないのはなぜかと思うかもしれません$m1[0]->[1]。参照のリストまたはハッシュ内のリストまたはハッシュ要素にアクセスするときに矢印を省略できるという特別なルールがあるため、代わりにandの代わりに書くことができます。$mr->[0][1]$mr->[0]->[1]$m1[0][1]$m1[0]->[1]

于 2013-07-11T07:41:58.267 に答える
0

$mr参照を保持します (概念的には、コンパイルされた言語の変数のアドレスに似ています)。したがって、余分なレベルの間接性があります。$mrに置き換えれ$$mrば大丈夫です。

ところで、これらのような質問は、 perldocのチュートリアルを参照することで簡単に確認できます。

于 2013-07-11T07:49:36.253 に答える
0

あなたが言った:

print "$m1[0][1]\n"; # this statement outputs: 2; that is expected.

print "$mr[0][1]\n"; #this statement doesn't output anything.

両方の回で同じ構文を使用したことに注意してください。

この最初の行で確立したように、この構文は と という名前の配列にアクセスし@m1ます@mr。という名前の変数がない@mrため、 に対して undef が得られます$mr[0][1]

スカラー$mrと配列@mrが互いに関係がないことに気付いていないかもしれません。

use strict; use warnings;これらおよび他の多くのエラーを回避するために使用してください。

于 2013-07-11T11:09:05.880 に答える