• ベストアンサー

配列について

$abc[5] = 20; は、判るのですが @abc[5] = 20; は、判りません お願いします。

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

  • ベストアンサー
  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.2

スカラーコンテキストと、リストコンテキストの違いであり、 配列の要素と、配列のスライスの違いでもあります。 とにかく、Perlを学びたければ、「コンテキスト」を極めること。 「コンテキスト」がわからなければ、エレガントな記述は不可能です。 1)$abc[5] = 20; まず、コンテキストをみます。 $abc[5] ~~~~~~~ これはスカラーコンテキストを持ちます。 $がついているのはそのためです。 それだけではなく、 $abc[5]    ~~ ここの[ ] の中もスカラーコンテキストを持ちます。 ※重要項目 「スカラーコンテキスト中では、値が1つだけ採用される。  スカラーコンテキスト中に、リストを投げ込んだ場合、リストの最期の値が  採用される」 $abc[5,1,3]=(20,10,5); すなわち、上の記述は一応OKです。しかし、実際には、 $abc[ 3]=( 5); と等価となります。 以上が、「配列の要素」です。 2)@abc[5] = 20; まず、コンテキストをみます。 @abc[5] ~~~~~~~ これはリストコンテキストを持ちます。 @がついているのはそのためです。 それだけではなく、 @abc[5]    ~~ ここの[ ] の中もリストコンテキストを持ちます。 ※重要項目 「リストコンテキスト中では、値が複数採用され得る。  (一般的には0個以上であるが、配列のスライスの中などでは1つ以上必要)  リストコンテキスト中に、1つの値をなげこんだ場合は、要素が1つだけのリストと見なされる」 @abc[5,1,3]=(20,10,5); すなわち、上の記述は以下と同様です。 $abc[5]=20; $abc[1]=10; $abc[3]=5; 上のことより、[]の中のスライスがひとつの場合、 @abc[5] = 20; すなわち、上の記述は以下と同様です。 $abc[5] = 20; 以上、$abc[5]=20; と @abc[5]=20; は仕組みとしては上述のように 違いますが、結果としては同じになります。 以上、Perl/CGI 学習の参考にしてください。

その他の回答 (1)

  • Neigh
  • ベストアンサー率16% (1/6)
回答No.1

スカラー変数が変数名の前に「$」をつけて表すのに対し、配列変数では変数名の前に「@(アットマーク)」をつけて表します。 例) @a = (1,2,3); @b = (@a,4,5); @c = @b; @d = 1; @d = (@d,2,3); ($a,$b) = ($b,$a); ($e,@c) = @c; ($a,$b,$c) = @c; ($a,$b,$c) = (1); 意味) @aに(1,2,3)がセットされる @bに(1,2,3,4,5)がセットされる @cに@bを複写する @dに(1)がセットされる @dの末尾に2と3を追加する $aと$bを入れ替える @cの1つめの要素(この場合は「1」)を 取り除いて、$eにセットする。 @c==(1,2,3,4,5)だが、左辺には3つ分の 変数しかないので、初めから3つ分の要素を 左辺の変数にそれぞれ代入して、残りの2つ の要素は捨てられる。 ($a==1,$b==2,$c==3となる) 左辺の変数の方が多い場合、余った変数には undef値が代入される。 ($a==1,$b==undef,$c==undefとなる)

関連するQ&A

専門家に質問してみよう