- ベストアンサー
配列変数のクリアについて
$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)をクリアして使おうとしたら、こんな事になっていました。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
配列を初期化するには @str = (); # 空リストの代入 とするか、あるいは undef @str; # 配列領域のクリア とします。 また、あまりやりませんが $#str = -1; # 要素の切り詰め なんて方法もあります。 普通は1番目の方法を使うことが多いです。 @str = ""; というのは、「空文字列」1つからなるリストを代入する、という意味(つまり、@str = (""); と同じ)なので、@str の0番目に "" が入っていることになります。 このため、2回目の処理では0番目を飛ばして push されたように見えたのです。
その他の回答 (1)
- shotaro777
- ベストアンサー率21% (4/19)
@がつくものをリスト変数っていいます。 このリスト変数,初期化のやりかたをみたら分かりやすいと思います。 例) @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を順に代入したからそのような結果になったと思われます。
お礼
@str=""; で初期化できると思っていました。(^_^; 有り難うございます。
お礼
@str=""; で初期化できると思っていました。(^_^; 初期化の方法を教えていただきまして有り難うございます。