• ベストアンサー

splitがうまくできません。

下記は数の大きい順に並び替えるスクリプトです。 if($numberw lt $numberh)の行で"use of uninitialized value in string lt"というエラーが出るので $numberwと$numberhの中身を調べたところsplit後に値が入ってなく、なぜうまく入らないのかわかりません。@emojiの内容は 1<> \$G! <>80 2<> \$G" <>50 3<> \$G# <>273 4<> \$G\$ <>80 5<> \$G% <>50というのが400行ほど続きます if(!open(READ,"<./emoji/emoji_sb.txt")){ die "ファイルがないです"; } flock(READ,1); @emoji=<READ>; close(READ); while(1){ while($emoji[$i]){ (undef,undef,$numberw)=split(/<>/,chomp($emoji[$i])); (undef,undef,$numberh)=split(/<>/,chomp($emoji[$j])); if($numberw lt $numberh){ $emoji=$emoji[$i]; $emoji[$i]=$emoji[$j]; $emoji[$j]=$emoji; $flag=1; } $i++; $j++; } if(!$flag){ last; } $i=0; $j=1; $flag=0; } close(READ); わかる方よろしくお願いいたします。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>(undef,undef,$numberw)=split(/<>/,chomp($emoji[$i])); これだと chomp の「戻り値」に対して splitしようとしています。 chomp した後の変数に対してやりたいのならこう書いてはダメです。 >@emoji=<READ>; このあたりか splitの直前にやればいいかと思います。 もうひとつ >if($numberw lt $numberh){ だと文字列比較になっちゃうけどいいのでしょうか?

noname#178821
質問者

お礼

ありがとうございます。 chompは確かにそうでしたね・・・すっかり忘れていました。 ltも<にしたら大きい順に並び替えることは出来たのですが use of unititialized value in scalar chomp at chomp($emoji[$j]) use of unititialized value in split at (undef,undef,$numberh)=split(/<>/,$emoji[$i]); use of unititialized value in numeric lt(<) at if($numberw<$numberh) というエラーが出てしまいます。 変数に数字も入っているしなぜなのでしょうか。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

> ltも<にしたら大きい順に並び替えることは出来たのですが > use of unititialized value in scalar chomp at chomp($emoji[$j]) > use of unititialized value in split at (undef,undef,$numberh)=split(/<>/,$emoji[$i]); > use of unititialized value in numeric lt(<) at if($numberw<$numberh) > というエラーが出てしまいます。 > 変数に数字も入っているしなぜなのでしょうか。 2つほど問題があるように思います。 (1) $i, $j, $flag の初期化を外側の while の最後で行っているので、1回目の内側の while   の実行時に初期化されていない。while(1) の直後に移す等が必要。 (2) while ($emoji[$i]) の $i が配列の最後の要素を参照してい入るとき、$j は配列の範囲を   超えてしまう。while の条件を $i < $#emoji 等に見直す必要があります。

すると、全ての回答が全文表示されます。

関連するQ&A