• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:高速に文字列の比較)

高速に文字列の比較

Tacosanの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

なんで配列なりハッシュなりを使おうとしないんだろう. あと, 本当に速度を気にするならデータベースの使用も視野に入れたいところ.

TPR_SET
質問者

お礼

有難うございます。 push(@data, "$xid"); 配列はこんな感じでいいのでしょうか? この場合、以下の箇所をどのように書き直すのがいいのかわかりませんでした。 初歩的な質問で申し訳ないのですが、よろしくお願いいたします。 foreach ( split(/,/, $data) ) { if ($ip eq $_) {$xdata.= "$ip,$x,$z\n";} }

TPR_SET
質問者

補足

foreach (@data) { if ($ip eq $_) {$xdata.= "$ip,$x,$z\n";} } 申し訳ありません。勘違いしていたようです。 出来ました。 ファイルの比較は、いろいろ考えていたところ、 改良案が思いついたので、 $fileの$data .= "$ip,";は、1000行分で、 $file2はファイルが10万行以内で収まりそうです。 あと、教えていただいたデータベースの使い方も勉強してみようと思いますが、 質問にある書き方より、本来はこうやって書くほうがいいよという サンプルコード等があれば、参考のため、よろしくお願いいたします。

関連するQ&A

  • テキストファイルの高速な読み込みは?

    1つのテキストファイル(5~10KB)を一度に変数に読み込むために、 open(IN, $file); my $data = join('',<IN>); close(IN); と、 my $data; open(IN, $file); while(<IN>){ $data .= $_ } close(IN); の2つを比較していたのですが、自分がベンチマークをとった限りでは後者の方が速いみたいです。これより早い方法はないでしょうか?

    • ベストアンサー
    • Perl
  • dataファイルの特定の行から特定の行をダンプさせるには?

    $ cat data.txt #No1. abc... #No2. def... #No3. ghi... #No4. jkl... #No5. mno... なるデータの、例えば#No2.から#No4.までのデータだけをダンプするのに、 open(IN,"data.txt"); my $flag=0; while(<IN>){ if ( $_ =~ /#No2./ && $flag == 0) { $flag=1; } if ( $_ =~ /#No5./ && $flag == 1) { $flag=0; } print if $flag==1; } close(IN) と書いてみましたが、もっと簡単に書く方法を以前見たことがあったように思うのですが、こう書けばよいのでは?というアイディアがあれば、ご教授いただけないでしょうか?

    • ベストアンサー
    • Perl
  • 文字列の比較の仕方が分かりません

    フォームから入力された文字列をデータファイルの中から検索し、重複していなければ追加登録したい。 ・問題点 重複していても登録できてしまう。 昨日からperlを触り始めたばかりなので、基本的な部分が分かっておらず、 おかしい部分が多々あるかもしれませんが、ご指導よろしくお願い致します。 データは全て"["から始まるので、登録できませんの部分は、簡単な入力チェックです。 -------------------------------------------- test.html <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> </head> <body> <form action="test2.cgi" method="post"> <input type="text" name="shirolist" size="50" /> <input type="submit" name="submit" value="送信" /> </form> </body> </html> -------------------------------------------- test2.cgi #!/usr/local/bin/perl use utf8; use CGI; $q = new CGI; $flag = 0; $data = $q -> param('shirolist'); $data =~ s/\s+//g; open(IN , "<:uft8" , "data.dat"); while($line=<IN>){ if ( $line eq $data ) { $flag = 1; } } close(IN); if($flag == 0){ if ($data =~ /^\[/) { open(OUT,">>data.dat"); print OUT "$data\n"; close(OUT); $pr="を登録しました"; } else { $pr="は登録できません"; } } else { $pr="は登録済みです"; } print "Content-Type: text/html; charset=UTF-8\n"; print "$data $pr<br>\n"; ※Yahoo知恵袋で同様の質問をしましたが、 回答者への個別のコメントや追加質問が出来ず、 非常に使いづらく感じたのでこちらに投稿させて頂きました。

    • ベストアンサー
    • Perl
  • ロック処理について

    ロック処理について my$id="abc"; open(IN,"file"); while(<IN>){ my ($cid) = split(/\,/); if($cid eq $id){&error;} } close(IN); open(OUT,">>$file"); print "$id,$pass\n"; close(OUT); いままで上記のような書き方でも普通にロック機構を使っていたのですが、 ふと、追加書込みなら必要ないのではと思い至りました。 上記のようにファイルに追加書込みする場合は、ロックは必要ないのでしょうか?

    • ベストアンサー
    • Perl
  • プログラムの高速化

    いつもお世話になっております.以下のプログラムをできるだけ高速化したいと思います. use warnings; use strict; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); open(FILE, $dir) or die "$dir: $!"; while (my $line = <FILE>) { my ($a,$b,$c,$d,$e,$f) = split( /,/ , $line ); my $name = $a.",".$b; open(NEWFILE, ">> ./out/$name.txt") or die "$dir: $!"; print NEWFILE $line; close(NEWFILE); } } close(FILE); closedir(DIR); やっていることは,ディレクトリ内のテキストファイルを読み込んでいって,splitでカンマ区切りにした,$a,$bをファイル名として下のディレクトリのoutに保存していくというものです. ファイル数が数千あり,各ファイルも数千行となるため,このソースを高速化する方法はありますでしょうか.ご回答よろしくお願いします.

    • ベストアンサー
    • Perl
  • 文字の置換がうまくいかない

    ********** test.txt ************* $first = "abc"; $last = "xyz"; ********************************* ********** change.txt *********** $first $firstaaa $last ********************************* という2つのテキストファイルがあったとして、 open(IN,"test.txt"); @data = IN; close IN; open(A,"change.txt"); while(<A>){$a_data .= $_} close A; foreach (@data) { if(/(\$[a-zA-Z_]+)[\t\s]*=[\t\s]*"(.+)"[\t\s]*;/){ my $name = $1; my $value = $2; print "$name<br>"; #$nameに何が入っているか表示 $a_data =~ s/$name/$value/g; } } としても、change.txtの$firstや$lastがabcや、xyzに置換されないのですが、なにがいけないのでしょうか?print "$name<br>";のところではちゃんと$firstと$lastという風に出力されています。$a_data =~ s/$name/$value/g;を$a_data =~ s/\$first/$value/g; と変えると、ちゃんと$firstだけ置換されました。 なにか心当たりがある方、よろしくお願いします。

    • ベストアンサー
    • Perl
  • KENTさんの掲示板のワード検索について

    http://www.supra.cx/joyful2chMe/index.html こちらのjoyful2ch.cgiの1071行目からのワード検索で、 検索対象を親記事のみにしたいのですが、どうすればよいでしょうか。 ログの中の$reno=""が親記事のようなのですが・・ # ファイルを読み込み @new=(); open(IN,"$logfile") || &error("Open Error : $logfile"); $top = <IN>; while (<IN>) { $flag=0; foreach $pair (@pairs) { if (index($_,$pair) >= 0) { $flag=1; if ($in{'cond'} eq 'OR') { last; } } else { if ($in{'cond'} eq 'AND') { $flag=0; last; } } } if ($flag) { push(@new,$_); } } close(IN); ここの辺りを書き換えるのでしょうか。

    • 締切済み
    • CGI
  • リクエストの待ち時間が期待通りになりません。

    リクエストの待ち時間が期待通りになりません。 5秒以内にリクエストが行われた場合は、ループとスリープで待たせて、ログに記録されているタイムから5秒以上経過した時点で、新たにログにタイムを記録させたいと思っています。 複数人で同時アクセスもありますので、ループ内で常に最新のファイルを読み込む必要がある?ので、 以下のように書いてみましたが、5秒以内にリクエストした場合、通常は1秒待てば処理が終わるはずなのですが、ループが途中で終わらずに20秒待たされ、$flag==0のまま終わります。 適当な知識しかなくて恥ずかしいですが、どこか間違えている場所があればご指摘くださると幸いです。 my $logfile = "request.dat"; my $time = time; my $i = 0; my $flag=0; while ($i < 20) { $i++; open(IN, "< $logfile"); my ($request_time) = <IN>; close (IN); if($time < $request_time+5) { sleep(1); } else { $flag=1; last; } } if($flag==0){&error;} else { open(OUT,">$logfile"); print OUT $time; close(OUT); }

    • ベストアンサー
    • Perl
  • 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); わかる方よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 文字列の抽出

    指定したファイルの中から'<'と'>'とで囲まれた部分文字列を抽出したいのですが方法がわかりません。どのようにしたらできるでしょうか? *ファイルは制御コードが混じっているのでバイナリとして扱わないといけないかもしれません。 よろしくお願い致します。 ------------------------------------------------- open(IN, "test.dat"); open(OUT, "> out.txt"); binmode(IN); while (<IN>) { /^<(\w+)>$/; print OUT "$1\n"; } close(IN); close(OUT);

    • ベストアンサー
    • Perl