• ベストアンサー

配列変数のクリアについて

$line[0]='a,1,2,3,4,5'; $line[1]='b,1,2,3,4,5'; $line[2]='c,1,2,3,4,5'; $line[3]='d,1,2,3,4,5'; $line[4]='e,1,2,3,4,5'; $line[5]='f,1,2,3,4,5'; for($i=0;$i<=$#line;$i++){ ($a,$b,$c,$d,$e,$f)=split(/\,/,$line[$i]); push(@str,$a); } for($i=0;$i<=$#str;$i++){ print '$str',"[$i] = ","$str[$i]\n"; } print "\n\n"; @str=""; for($i=0;$i<=$#line;$i++){ ($a,$b,$c,$d,$e,$f)=split(/\,/,$line[$i]); push(@str,$a); } for($i=0;$i<=$#str;$i++){ print '$str',"[$i] = ","$str[$i]\n"; } __END__ 実行結果 $str[0] = a $str[1] = b $str[2] = c $str[3] = d $str[4] = e $str[5] = f $str[0] = $str[1] = a $str[2] = b $str[3] = c $str[4] = d $str[5] = e $str[6] = f 二回目は$str[0]から入らないのですね。 @str=""; にその様にさせる意味があったのでしょうか? pushなので、変数(@str)をクリアして使おうとしたら、こんな事になっていました。

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

配列を初期化するには   @str = ();      # 空リストの代入 とするか、あるいは   undef @str;     # 配列領域のクリア とします。 また、あまりやりませんが   $#str = -1;     # 要素の切り詰め なんて方法もあります。 普通は1番目の方法を使うことが多いです。   @str = ""; というのは、「空文字列」1つからなるリストを代入する、という意味(つまり、@str = (""); と同じ)なので、@str の0番目に "" が入っていることになります。 このため、2回目の処理では0番目を飛ばして push されたように見えたのです。

kapran
質問者

お礼

@str=""; で初期化できると思っていました。(^_^; 初期化の方法を教えていただきまして有り難うございます。

その他の回答 (1)

回答No.1

@がつくものをリスト変数っていいます。 このリスト変数,初期化のやりかたをみたら分かりやすいと思います。 例) @menu=("定食", "うどん", "カレー", "ラーメン"); とすると, menu[0]="定食"; menu[1]="うどん"; menu[2]="カレー"; menu[3]="ラーメン"; となります。 質問文の場合, @str=""; ですから; str[0]=""; が入るわけです。 そして, for($i=0;$i<=$#line;$i++){ ($a,$b,$c,$d,$e,$f)=split(/\,/,$line[$i]); push(@str,$a); } によって配列strの後ろからa,b,c,d,e,fを順に代入したからそのような結果になったと思われます。

kapran
質問者

お礼

@str=""; で初期化できると思っていました。(^_^; 有り難うございます。

関連するQ&A