1 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 22:35:39 ] "The duct tape of the Internet" こと、Perlについての質問箱です。 "There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。 CGIについての質問は板違いです。WEBプログラミング板でどうぞ。 CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。 (WEBプログラミング板 pc8.2ch.net/php/ ) CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 www.perl.org/get.html ● 2006/12/21現在の最新版: 5.8.8 ● 2006/12/21現在の開発版: 5.9.3 前スレ Perlについての質問箱 28箱目 pc8.2ch.net/test/read.cgi/tech/1162273941/ リンク集は>>2-3 過去スレは>>4
620 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 11:04:20 ] >>588 ,599 それは文字化けでなく、エスケープされてるだけ。 Data::Dumper の仕様
621 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 11:30:06 ] 詳説正規表現第2版 7.8.8 名前つきキャプチャを模倣する (.*?)(?{ $name = $^N })
622 名前:592 mailto:sage [2007/02/11(日) 15:22:43 ] タグそのものだけでなく、例えば<pre>の内側はエスケープしない、など、 ちょっと込み入っている場合、例外事後処理だと信じられないほど遅くなりました。 コーディングに問題があったかも知れませんが。 という訳でスプリット型に戻しました・・。もっとうまい方法があるでしょうか。 sub escape_limited { my %args = (str => '', exception => [], exception_block => [], @_); my @regexp_array; (scalar @{$args{'exception_block'}}) and push(@regexp_array, sprintf(q!<(%s)\b.*?>.+?</\2>!, join('|', @{$args{'exception_block'}}))); (scalar @{$args{'exception'}}) and push(@regexp_array, sprintf(q!</?(?:%s)\b.*?>!, join('|', @{$args{'exception'}}))); return &loop($args{'str'}, join('|', @regexp_array)); sub loop { if ($_[1]) { my @scraps = split(/($_[1])/is, $_[0], 2) ; return &escape($scraps[0]). $scraps[1]. &loop(pop(@scraps), $_[1]) if ((scalar @scraps) >= 3); } return &escape($_[0]); } }
623 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 18:28:22 ] >>619 たぶんアプローチが根本的に間違ってる。
624 名前:616 mailto:sage [2007/02/11(日) 19:05:54 ] >>621 ありがとうございます!知らなかったです使わせて頂きます。 search.cpan.org/dist/perl/pod/perlre.pod >>623 良くあるので、今回もそうかもしれないのですが; www.nicovideo.jp/ の検索のラッパーとして、 www.kiseki.info/niko-per/matome_search.cgi を作りました。 そして、上記ラッパーの正規表現生成に、 www.kiseki.info/niko-per/regexNikoniko.txt というコードを使っていました。(>>621 さんのアドバイス未導入コード) お暇があればアドバイスいただけると幸いです。
625 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 22:38:26 ] 前から疑問に思ってたんですが、 $input = 'hoge'; $output = $input; $output =~ s/ho/ha/g; return $output; これを$outputを使わずにreturn &func($input, /ho/, 'ha'); みたいに表現することはできないんでしょうか。
626 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 22:54:33 ] こんなん? join('ha', split(/ho/, $input))
627 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 23:09:34 ] return str_replace('ho', 'ha', $input);
628 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 23:11:41 ] >>627 どこの国のPHPだよ
629 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 00:06:59 ] 関数的な操作が充実してる割に標準でついてる関数がほとんど破壊的なんだよな
630 名前:592 mailto:sage [2007/02/12(月) 00:10:16 ] すみません、うそを言いました。594さんのがやっぱり一番速いです。 遅くなったのはバグでした。スレ汚しすみません。
631 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 02:58:08 ] パッケージが提供してる関数の一覧って簡単に取得できますか?
632 名前:631 mailto:sage [2007/02/12(月) 03:15:00 ] ちょっとぐぐったら見つかりました。すみません。 search.cpan.org/~mlfisher/pmtools-1.01/pmeth サブクラスなどにもぐっていく処理もありますが、どうもこの行がミソのようでした。 keys %{ "$module::" }
633 名前:デフォルトの名無しさん [2007/02/12(月) 07:44:44 ] 動的に生成された複数のPNG画像データをzip圧縮したいと考えています。 GDモジュールとArchive::Zipモジュールが活用できそう、 と調べたのですが不明点があります。 Archive::ZipモジュールのaddFileメソッドは引数としてファイル名が必要ですが、 GDモジュールのpngメソッドで動的に生成されたPNG画像データをzip圧縮するにはどうしたら良いでしょうか。 生成されたPNGデータをbinmodeを使用して画面表示するサンプルは見かけたのですが・・・ Perlを勉強し始めたばかりで基本事項も良く分からず五里霧中です。 アドバイスのほど、よろしくお願いいたします。
634 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 09:40:25 ] addString
635 名前:デフォルトの名無しさん [2007/02/12(月) 13:43:39 ] system() で所定の場所からwgetでファイルを持ってくる処理を作っています。 必ずしもその場所にファイルがあるとは限らないので、ファイルが無かった時と 接続出来ないなどで取ってこれなかった時を判定したいのですが、どうすれば よいのでしょうか?
636 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 13:47:37 ] system関数の戻り値でチェックできないの?
637 名前:デフォルトの名無しさん [2007/02/12(月) 14:20:49 ] >>636 ありがとうございます。 やってみましたが、ファイルが無かった時も接続できなかった時も、戻り値は 256となるので区別がつかないです・・。
638 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 14:21:07 ] wgetの複雑な機能をバリバリ使ってるなら別だが、ただファイルとってくる だけならLWP使う方がその辺のエラー処理は書きやすいと思うけどな。
639 名前:デフォルトの名無しさん [2007/02/12(月) 14:39:33 ] >>638 すみません、wgetを使わないといけないので別の方法で取ってくるというのは 出来ないのです。
640 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 15:06:35 ] 美しくないがstderr読むしかないだろう
641 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 15:11:25 ] 接続とファイル存在チェックだけ別ルーチンで作っといて、 それがOKならwgetで取ってくるってのはどうだ?
642 名前:デフォルトの名無しさん [2007/02/12(月) 15:59:14 ] >>640 ,641 ありがとうございます。>>640 さんの方法の方が簡単そうなのでこちらで いこうと思うのですが、 open(STDERR, ">> errmsg.txt"); $ret = system("wget 〜"); close(STDERR); とやって、$ret が256 だったらerrmsg.txtを1行づつ読み込んで [ 404 Notfound ]という文字列が見つかったらファイルなし、無い ならその他のエラー、という感じでいいのでしょうか?
643 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 16:27:24 ] というかwgetはちゃんと終了コード返すけど? # wget -q www.google.com/ && echo ok ok # wget -q www.google.com/nonexist || echo ng ng #
644 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 16:28:39 ] あーごめん、404と接続できなかった時とを区別したいのか。早とちりスマソ。
645 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 20:57:32 ] 気にしてへんからええよ。 書いてくれてありがとな。
646 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 00:23:46 ] >>642 perldoc IPC::Open3
647 名前:デフォルトの名無しさん [2007/02/14(水) 00:10:02 ] 数字と文字が混在した要素からなる配列があるんですけど、これをsortすると 1〜〜,11〜〜,2〜〜,23〜〜・・・ という風になってしまいます。 これを数字順 1〜〜,2〜〜,11〜〜,23〜〜・・・ にするにはどうすればいいのでしょうか??
648 名前:デフォルトの名無しさん [2007/02/14(水) 00:17:12 ] >>647 @dst = sort { $a <=> $b } @src; # 数値ソート @dst = sort { $a cmp $b } @src; # 文字列ソート(こっちは略せる)
649 名前:デフォルトの名無しさん [2007/02/14(水) 00:39:50 ] >>648 それ試したんですけど、数字順にならないんです・・orz
650 名前: ◆TWARamEjuA mailto:sage [2007/02/14(水) 00:49:01 BE:3049474-2BP(6811)] @dst = sort { sprintf qq|%02d|,$a cmp sprintf qq|%02d|,$b } @src; とかとか♪
651 名前:デフォルトの名無しさん [2007/02/14(水) 00:53:47 ] >>650 Sort subroutine didn't return a numeric value ってエラーがががorz
652 名前:脱帽 mailto:sage [2007/02/14(水) 00:59:09 ] ちょうてけとう @dst = sort { ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] } @src;
653 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 00:59:59 ] print join qq/, /, sort { $a <=> $b } qw/21d 1aa 11b 2cc 13e 5b/; 1aa, 2cc, 5b, 11b, 13e, 21d ちゃんとなってるけどなあ
654 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 01:08:03 ] >>653 いろいろ試したらできました。 splitを何回か使って要素の中の数列にまで要素を分割して比較したらうまくいきました。 俺なんかに付き合ってくれてありがとうございましたm(_ _m)
655 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 05:36:07 ] ひ〜(悲鳴)
656 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 06:05:37 ] (悲鳴)
657 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 06:25:24 ] シュー 三(悲鳴)
658 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 06:31:03 ] 質問〜perlから直接web上のファイルを開く事はできますか? ソースをテキストで保存したくて open(IN,"**** ・・・") or die "無理"; ってやってみたら無理でした。
659 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 06:56:37 ] startup.plに print int rand 10; のようなコードを入れたtest.plをrequireして実行すると ↓↓httpdプロセス番号(実行結果)↓↓ 1(3), 2(3), 3(3), 1(5), 2(5), 3,(5), 1(2), 2(2), 3(2) のように完全でない乱数がある規則で発生してしまいます。 srandを加える、もしくはtest.plを意図的に更新し共有メモリから外すと期待通り全て違う表示がされます。 なぜこのような動作になるのか教えていただけませんでしょうか。 環境はFedora core5、Perl v5.8.8、mod_perl-2.0.2-5.1、httpd-2.2.2-1.2(prefork)です。
660 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 07:17:33 ] >>658 www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq9.html#how_do_i_fetch_an_html_file >>659 【激速】mod_perl SpeedyCGI FastCGI【激速】 pc10.2ch.net/test/read.cgi/php/1149505269/
661 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 07:32:33 ] あ、ありがとうございます! お陰で心置きなく寝れます。いや、仕事でした。いってきます;;
662 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 11:51:52 ] % cat > test.pl #!/usr/bin/perl $ID = "id"; $PASS = "pass"; __END__ perlと余り関係ない質問かもしれませんが.. 上の様なスクリプトを作った場合ファイルを開くと$PASSの「pass」が丸見えに なるのですがこの部分を暗号化してわからないようにしてスクリプト実行時に 何らかの処理をして$PASSをpassに戻すような事は可能でしょうか?
663 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 12:01:30 ] なんらかの処理をしてpassに戻ったら意味がないだろうが SHA-1とかでハッシュにしてそれを持ってるとよろし
664 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 12:05:42 ] >>663 ありがとうございます ぐぐってきます..(´・ω・)
665 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 13:30:21 ] 音声入力でPerlスクリプトを書ける時代はいつになったら来るのかね ttp://www.youtube.com/watch?v=KyLqUf4cdwc
666 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 14:08:49 ] >>665 なんか失敗ばっかりしているように見えるね。
667 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 14:35:28 ] >>665 warata
668 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 14:45:30 ] >>665 やべえ面白すぎるwww
669 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 15:29:03 ] SMTPを使わず/usr/lib/sendmail等から送る場合sendmailをパイプでopenする 手法がよく使われていますがこれらを実現出来るCPANに登録されているスタンダードな モジュール名を教えていただけませんでしょうか。
670 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 15:39:30 ] 途中で手入力してるしw 開発部署のあちこちのデスクから、こんなん聞こえてきたらコエー。
671 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 15:56:45 ] >>669 search.cpan.orgでsendmailをキーワードに検索すればいくつか出てくるので 適当に好きなのを使えばいいんじゃないか。
672 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 20:43:09 ] >>665 この後に、オフィスPCに切れて投げ壊してる外人おっさんの動画を
673 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 21:31:26 ] >>665 That was eazy.txt ワロス
674 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 21:57:07 ] Thank you って言ったらそれまで入ってもうて、必死で消してるw
675 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 22:00:56 ] Undoできないのかな
676 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 22:03:04 ] 5分もかかってまだ open ( INFO しか入力できてねぇしw
677 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 22:12:07 ] いや、INFO は結局入力できず手で入れてたし。
678 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 22:39:15 ] 検索結果を表示させるだけのものなんですが、大文字小文字の区別がつきません 297 if ( $line =~ /\Q$in{$form1}\E/ ) { を if ( $line =~ i/\Q$in{$form1}\E/ ) { にするとエラーが出てしまいます syntax error at test.cgi line 297, near "$in{" syntax error at test.cgi line 297, near "/ )" syntax error at test.cgi line 300, near "}" Execution of test.cgi aborted due to compilation errors. 292 sub umu1 { 293 open(IN,"$file"); #csv読み込み 294 while(1) { 294 $line = <IN>; #csvの行を&lineに代入 295 @data = split( /,/ ,$line ); #@data[0~]にcsv行を個別に代入 296 if ( $line eq "" ) { last; } #無限ループ終了条件 297 if ( $line =~ /\Q$in{$form1}\E/ ) { 298 print "$data[0]$data[1]"."<br>"."\n"; 299 } 300 } 301 close(IN); 302 }
679 名前:678 mailto:sage [2007/02/14(水) 23:04:54 ] 自己解決しました。なんともお粗末なミスで・・・
680 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 00:37:59 ] WWW::Mechanizeを使用しているのですが、RecIE(www.h7.dion.ne.jp/~umiumi/ ) のように、IEにhtmlの内容を表示させながらhtml解析する方法ってないでしょうか? 今はcontentで一旦ファイルに保存して、systemでIEを起動させ表示させています。
681 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 10:04:00 ] sub foo { 処理 return(@A,@B,@C) } としている関数で、 (@A,@B,@C) = &foo() ↑のような感じで返り値を配列個別に受け取りたいんですが、 Perlでは可能なんでしょうか?
682 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 10:16:08 ] sub foo { hoge; return \(@A, @B, @C); } ($refA, $refB, $refC) = foo; こういう感じにリファレンス渡しにしないといけない。
683 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 11:20:31 ] >>680 Win32OLE JavaScriptみたいなタグの分解も一緒にやってくれる
684 名前:デフォルトの名無しさん mailto:sage [2007/02/16(金) 04:43:05 ] Win32::GUIのListviewで行ごとに色を変えるにはどうしたらよいでしょうか?
685 名前:デフォルトの名無しさん mailto:sage [2007/02/16(金) 14:44:56 ] >>684 カスタムドローかオーナードロー ってかWinAPI使うならCとかC++のが断然楽だぞ?
686 名前:デフォルトの名無しさん mailto:sage [2007/02/16(金) 17:14:27 ] >>685 カスタムロードがいいみたいですね。 Perlのサンプルコードはぜんぜんないようで。。。 困った
687 名前:デフォルトの名無しさん mailto:sage [2007/02/16(金) 17:21:16 ] ドロー
688 名前:デフォルトの名無しさん mailto:sage [2007/02/16(金) 17:36:30 ] >>686 Win32::GUIって自分でウィンドウメッセージ取れないのか? 取れるならC,C++のサンプルコードと同じようにできるが できないなら知らん
689 名前:デフォルトの名無しさん mailto:sage [2007/02/16(金) 19:01:28 ] perl-win32-gui.sourceforge.net/cgi-bin/wiki.cgi?Change_Listview_Item_Color サンプルコードは一応あるんだが、エラーが出て動かん。 カスタムドローの構造が古いのかな??? バイナリをいろいろ変換してるがよう分からんわ。
690 名前:デフォルトの名無しさん mailto:sage [2007/02/17(土) 15:11:52 ] >>689 substr( $lParam, 48, 8, $clrText); を substr(unpack("P56", pack("L",$lParam)), 48, 8, $clrText); にするとエラーは無くなるが、文字色は変わらない。 要するに、$lParamはNMLVCUSTOMDRAW構造体へのポインタ cf. www.kumei.ne.jp/c_lang/sdk3/sdk_261.htm であって、この構造体の中身を書き換えればいいように思えるのだが、 Perl でどうすればいいのかわからない。
691 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 17:54:02 ] CUIサーバープログラムで裏で1秒ごとにデータファイルを読み込みながら クライアントにその時々の最新データを返すにはどのようにすればいいのでしょうか? &readdata sub readdata{ after(1000,&readdata); }
692 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 17:55:11 ] Tkで使うafterのようなものがあるのでしょうか? ということの説明のためにコードを書いていたのですが、途中で投稿してしまいましたorz
693 名前:デフォルトの名無しさん [2007/02/18(日) 19:55:10 ] sleep(1)
694 名前:デフォルトの名無しさん [2007/02/18(日) 20:26:34 ] ある数値が何行にもわたって書いてあるいくつかのテキストを読み込んで 指定した列の数値の平均を割り出すプログラムをperlで作りたいんですが どのように作ればいいんでしょうか? 入門サイトなどをいくつか見てきましたが これといったお手本が無く、行き詰まってしまいました。 お願いします。
695 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 20:47:41 ] >>694 もちっとデータに具体性を出してほしい 例を上げて
696 名前:デフォルトの名無しさん [2007/02/18(日) 20:56:22 ] >>695 レスありがとうございます。 例というか、実際に使うテキストファイルの最初の5行をそのままコピペしますが 0; 133.44; 3180 1; 134.76; 3180 2; 168.35; 3180 3; 141.58; 3180 4; 157.86; 3180 5; 176.92; 3180 こうなってます。 一番左は列数、二列目が平均値を出したいデータ、三列目は無視してください。 二列目の数値の平均値が出したいのです。 ひとつのテキストファイルに44640行、 こんな感じの数値がずらずらと並んでいるので 二列目の数値を全部足して44640で割る、ということがしたいんです。
697 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 21:11:30 ] とりあえず ・ファイルをperlに読み込んで各行をループさせる ・一行の中で、2列目の数値を取り出す といった操作が必要だけど、 ファイルの読み書きや、正規表現とか、まったく何も分からないの?
698 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 22:01:45 ] >>694 ちょうど最近それっぽい記事が出てた。 ttp://codezine.jp/a/article/aid/904.aspx 区切り記号が「,」か「;」の違いがあるとか微妙にちがうけど、 コレが理解できれば希望のスクリプトを書くのも出来るはず。 コピペだけですませようとしてるんなら無理だけど。
699 名前:デフォルトの名無しさん [2007/02/18(日) 22:02:02 ] >>697 一応、基礎的なことはサイトを見て勉強してきたんで 正規表現のことや ファイルを読み込んでコマンドプロンプトに内容を表示させたり ファイルの作成、書き込みなどは理解しているつもりです。 ただそれらのことを組み合わせてプログラムを作るとなると まだよくわからないんです。 もう明日中には完成させなきゃならないんで できればヒントだけでもお願いしたいです…
700 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 22:08:59 ] こんな感じじゃね?試してないけど。 my $sum = 0; my $i = 0; for my $file (qw(unko1.txt unko2.txt)) { open my $fh, $file or die "開けん"; while(<$fh>) { $sum += (/;\s*(-?\d\.\d);/)[0]; $i++; } } print "阿部怜治:", $sum / $i, $/;
701 名前:694 [2007/02/18(日) 23:30:17 ] >>698 .700 ありがとうございます。 もう少し頑張って明日試してみます。
702 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 00:43:52 ] じゃ模範的なperlで perl -pae "$l++;$s+=$F[1]}{$_=$s/$l" input.txt
703 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 00:58:40 ] perl -F";" -lane '$t+=$F[1]; END{print $t/$.}' input.txt
704 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 04:15:19 ] >>702 $F[1]}{ の }{ って何してるの?
705 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 04:59:09 ] >>704 $ perl -h -n assume "while (<>) { ... }" loop around program -p assume loop like -n but print line also, like sed -p は while (<>) { ... print; } で囲まれる。
706 名前:デフォルトの名無しさん [2007/02/19(月) 05:26:43 ] 挙動的に同じって意味だと思ってたら、 本当にプリプロセッサのように囲まれるのね
707 名前:デフォルトの名無しさん [2007/02/19(月) 18:41:27 ] if ($a) { print $a; } この書き方と print $a if $a; この書き方では何か違いはあるのでしょうか
708 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 18:44:48 ] 見た目
709 名前:デフォルトの名無しさん [2007/02/19(月) 20:24:07 ] すいません、質問です。 大体5万行くらいの大きさのテキストファイルから、 重複している行 (連続して重複してるわけでは無く、内容が同じ行が とびとびに存在してる)を一つのこして、残りは省く というスクリプトを書く場合、 1)1行目はそのまま書き出す 2)2行目は1行目と比較して、同じだったら書き出さない、違ったら書き出す 3)3行目は1行目と比較して、同じだったら書き出さない、違ったら2行目と比較して、、、 4)以下繰り替えし このようなスクリプトしか無いのでしょうか? 処理に非常に時間がかかるので、何か良い方法があったら、御教示下さい。
710 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 20:31:36 ] >>709 「perl 重複」でぐぐればいろいろテクニックが見つかる
711 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 20:36:03 ] >>709 5万行くらいなら全部ハッシュテーブルに詰め込んでも大丈夫そうだが 順序崩していいならソートしてから重複を除くのがいいだろう
712 名前: ◆TWARamEjuA mailto:sage [2007/02/19(月) 20:38:10 BE:2613683-2BP(6811)] 1. 1行目の内容をハシュのキーに詰め込む。 while (<$fh>) { $hash{$_} = 1; 2. 読み込みが終わったら、keyを書き出す。 print for keys %hash; 1-1. 読み込んだ順に書き出したい時。 my $line; while (<$fh>) { $hash{$_} = [$_, ++$line]; 1-2. 先に読み込んだ方を有効にしたい時。 $hash{$_} = [$_, ++$line] unless $hash{$_} ; 2-1. 読み込みが終わったら、sortしながらkeyを書き出す。 print for sort $hash{$a}->[1] <=> $hash{$b}->[1], keys %hash; 脳内妄想なので、補完よろしこ(照)
713 名前: ◆TWARamEjuA mailto:sage [2007/02/19(月) 20:39:43 BE:1742382-2BP(6811)] ん、、、リファレンスにしなくても良かったか(呆)
714 名前:709 mailto:sage [2007/02/19(月) 20:42:52 ] >>710-712 ありがとうございます。ハッシュテーブルを使う方法は、 全く考えてませんでした(というか今迄使ったことが無かったので) とりあえず、ハッシュテーブルの使い方を勉強してきます。
715 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 20:57:05 ] perl -ne 'print if not $seen{$_}++;' でいいだろ。 メモリ足りないようならtie()使ってDBMファイルをワークに使えばよし。
716 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 20:58:32 ] Perl やっててハッシュを使ったことが無いとな
717 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 22:07:13 ] 今までperlやってなかったんだろ
718 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 22:16:49 ] 無名(?)のBLOCKで、 {} ←中身が空だとエラーになるんだけど、素のBLOCKは使ってもいいのか、 使えるが推奨されてないのか、perl的でないのか、どんな感じなんでしょう?
719 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 22:28:43 ] WindowsでNMAKEが必要なモジュールのインストールについて質問。 Windows2000では問題がなかったのに、vistaになってDBIとかがインストールに失敗する。 どうすれば回避できる?
720 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 22:41:06 ] >>719 そのエラーメッセージで言われてるところを直せばインストールできるんじゃないか