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

A 回答 (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 学習の参考にしてください。
    • good
    • 0

スカラー変数が変数名の前に「$」をつけて表すのに対し、配列変数では変数名の前に「@(アットマーク)」をつけて表します。



例)
@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となる)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このカテゴリの人気Q&Aランキング

おすすめ情報