• ベストアンサー

データの抽出、配列操作で教えて下さい。

こんばんは、お世話になります。 配列操作で教えて頂きたく。 次のデータをuser.datとします。 1<>yamada<>99999<> 2<>tanaka<>22222<> 3<>suzuki<>10101<> 4<>yamada<>12345<> 5<>yamada<>55555<> user.datの中からyamadaの行だけ取り出して 3番目の数字データでソート表示したいのですが なかなかうまくいきません。 open(F,"user.dat"); @load_txt = <F>; close(F); foreach $data (@load_txt){ if((split(/<>/,$data)[2]) eq "$usid"){push(@txt_lines,$data);} } @txt_lines = sort{(split(/<>/,$a))[2] <=> (split(/<>/,$b))[2]}@txt_lines; 上記でおかしな所ありましたらご教示頂きたく 宜しくお願いします。

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

  • ベストアンサー
  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.4

>ifとforeach文では駄目なのでしょうか? 「ifとforeachがだめ」というわけではないですが、 最適化の基本として、以下のような点が挙げられます。 「sort block内で複雑な処理をしない」 「多量の配列を作らない」 「配列のループは最小限に」 「ループ内で複雑な処理をしない」

その他の回答 (3)

  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.3

>foreach $data (@load_txt){ >if((split(/<>/,$data)[2]) eq "$usid"){push(@txt_lines,$data);} >} 上で[2]でeqするのはおかしいのでは? (下も[2]でsortしてるんだし) >@txt_lines = sort{(split(/<>/,$a))[2] <=> (split(/<>/,$b))[2]}@txt_lines; 多分こんな感じで動くはず。 (適当に最適化してます) open (F,'user.dat') or die; while (my $row = <F>) { my @col = split /<>/,$row; next unless $col[1] eq $usid; push @line,$row; push @srt,$col[2]; } close (F) or die; @txt_lines = @line[ sort { $srt[$a] <=> $srt[$b] } 0..$#line ];

noname#51438
質問者

お礼

ご返答有難うございます。 ご指摘の通り[2]ではなく[1]の転載ミスでした。 最適化の方ですがifとforeach文では駄目なのでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

if((split(/<>/,$data)[2]) eq "$usid"){push(@txt_lines,$data);} を if((split /<>/,$data)[1] eq $usid){push(@txt_lines,$data);} でどうでしょう 後、 $usid="yamada"; が要ると思いますが

noname#51438
質問者

お礼

ご返答有難うございます。 $usid="yamada"; "$usid"→"$usid" これも転載ミスでした 有難うございます。

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.1

コンパイルエラーはないですか? if((split(/<>/,$data)[2]) eq ↓ if((split(/<>/,$data))[1] eq

noname#51438
質問者

お礼

ご返答有難うございます。 色々試したのですがユーザーの抽出の所でうまく@txt_linesに記録されずにソート結果だけが表示されてしまいます。