• ベストアンサー

配列について

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

  • CGI
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • 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

  • 配列で分かりません

    教えてください。プログラミング初心者です。 以下の配列があった場合に最終行の$abc[ ] = $abc;は何を代入しているのでしょうか? $abc = array( ); $abc[ ] = $ def; $abc[ ] = $ abc; 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 配列のつなげ方

    配列をつなげて文字列にしたいと思っています。 Dim abc() As String Dim i As String Dim namae As String i=0 ここでDBに接続してループでまわしながらデータを取得してきます。 Do while y > z abc(i) = X i = i+1 loop Xはループがまわる毎に違う値がセットされます。例えば1回目のループでリンゴ、2回目のループでミカンといった具合にです。 つまり、abc(0)=リンゴ、abc(1)=ミカン、abc(2)=メロン といった具合にです。 最終的には namae="リンゴ、ミカン、メロン、・・・・"といった具合にnamaeに代入したいと思っています。namae = abc(0) & "," & abc(1) & ","....と やれば実現できるのはわかります。 Xにはデータがいくつはいっているかわかりません。どうやった式をたてれば、実現できるでしょうか?

  • 2次元配列について

    プログラミング初心者です。先日以下の例文を問い合わせさせていただきました。 答えとして$abc[0] に $def を代入して、$abc[1] に $abcという配列([0] に $def の内容がある)が代入されると教えていただき、実際確認しました。二次元配列入れ子のようになるのは解ったのですが、 どのような場合に使うのでしょうか? ホームページなどの画面に表示するのに使ったりするのでしょうか? それともデータベースからデータを抽出して一時的に、何らかのかたちで格納 したりする場合によく使われるのでしょうか? この例文だけどこかにあったので、実際どのように使うのかイメージできません。 すみません。教えてください。 <?php $def = 'test'; $abc = array(); $abc[] = $def; $abc[] = $abc; print '<pre>'; print_r($abc); print '</pre>';

    • ベストアンサー
    • PHP
  • 配列

    キーボードから文字列を二つ入力し、文字列が一致しているか否かを表示するプログラムで、 基本的な部分は出来たんですが文字列中の「?」はすべての文字と一致する文字とする、という条件がどうしてもわからずこまっています。 例:「abc?ef」 「abcDef」 「abc?ef」 「??ckef」(すべて一致する) よろしくお願いします。

  • 配列検索

    配列中に、特定の文字が無いか確認したいので、 これを使ってみてます。 in_array('abc', $a); でも、これは 「abc」という文字と完全一致しないとダメですよね。 「a」を含むという検索は出来ませんか?

    • 締切済み
    • PHP
  • 二次元配列の分割

    よろしくお願いします。 $hoge = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); というような配列があったとき、 abcが110以下のときと、110より大きい場合で分割した配列を 用意したいと考えてます。 具体的には、 $hoge1 = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), ); と $hoge2 = array( "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); に分割したいと考えています。 どのように記述すればよいのでしょうか?

    • ベストアンサー
    • PHP
  • 配列

    String型の配列の中の文字列の文字数を数える方法で困っています。 問題は、int型の変数lenで与えられた数字よりも大きい文字数の文字列はいくつあるか調べます。 例) stringsLongerThan({"a","ab","abc"}, 0) 3つ全ての文字列の文字数は0より大きいので3を返す stringsLongerThan({"a","ab","abc"}, 2) "abc"の文字数が2より大きいので1を返す stringsLongerThan({"a","ab","abc","abcd","abcde","abcdef","abcdefg"}, 3) "abcd","abcde","abcdef","abcdefg"の4つが文字数3より大きいので4を返す 途中まで組んだのですが、配列array[]の中の文字列の文字数を数えるにはどうしたらよいのでしょうか? public int stringsLongerthan(String[] array, int len){       int result=0;      for(int i=0;i<array.length;i++){        //ここで配列array[i]の文字列の文字数を数える       int count=文字数;       if(cont>len)        result++;     }      return result; } 宜しくお願いします。

    • ベストアンサー
    • Java
  • PHPで、フォルダーにあるファイルを配列に取り込みたい

    例えば次の様なフォルダーとファイルがあるとき \abc\a.txt \abc\b.doc \abc\def\b.doc \abc\ghi\a.txt \abc\ghi\b.doc 次の様な結果を得たいのですが、どうすれば良いでしょうか? $dir[/abc/a.txt] = "/abc/a.txt" $dir[/abc/b.doc] = "/abc/b.doc" $dir[/abc/def/b.doc] = "/abc/def/b.doc" $dir[/abc/ghi/a.txt] = "/abc/ghi/a.txt" $dir[/abc/ghi/b.doc] = "/abc/ghi/b.doc" 再帰関数でできそうに思うのですが、いくら考えても分かりません。 $path = "\abc"; function getfiles($path) {} print_r(getfiles($path)); みたいにして取り出せると助かります。 すみませんが教えてください。

    • ベストアンサー
    • PHP
  • 配列にきちんと入れる方法

    txtの行数字が合っている数字だけ(7.6.4.1)抜いて上から順に配列に入れたいのですが、何か微妙に違う結果になります。 7 7 10 7 6 6 4 4 5 4 9 4 1 1 2 1 $abc=file("1.txt"); for($l=0;$l<count($abc);$l++){ $def=explode("\t",$abc[$l]); if($def[0]==$def[1]){ $ll=array($def[0]); print_r($ll); }} Array ( [0] => 7 [1] => 6 [2] => 4 [3] => 1 ) 上記のようなブラウザ結果にしたいのですが、別々に配列が表示されてしまいます。どう記述すればこの結果になるでしょうか?ご教授ください。

    • ベストアンサー
    • PHP
  • 配列のキーに配列を使う場合

    初歩的な事なのかもしれないのですが、 $abc = $a["$b["c"]"]; のように配列のキーに配列を使いたいのですが、上記だとエラーが出ます。 どのように記述すればよいでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう