1 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 16:47:06 ] "The duct tape of the Internet" こと、Perl についての質問箱です。 "There's more than one way to do it" ということで、 Perl の奥深さについて皆で語り合い、追求してまいりましょう。 CGI についての質問は板違いです。WEB プログラミング板でどうぞ。 CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。 (WEB プログラミング板: pc11.2ch.net/php/ ) CGI の質問は答えが Perl と全然関係ない話に帰着する場合が 多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 www.perl.org/get.html ● 2010/02/19 現在の最新版: 5.10.1 ▼ 前スレ Perlについての質問箱 42箱目 pc12.2ch.net/test/read.cgi/tech/1257139591/ リンク集は >>2-3 Perl 日本語処理の基礎の基礎 >>4 過去スレは >>5-7 あたり
509 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 00:15:04 ] >>507 どうしても「初めてのPerl」を参考にして勉強したいというなら、 悪い事は言わないから第5版にした方が良い。 今、Perl4時代の本で勉強しても百害あって一利無しだと思うぞ? いくらなんでも時代遅れ過ぎる。 >>507 が使ってる Perl まで Perl4 というわでもあるまいに。
510 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 00:22:42 ] >>507 に必要なのは perldoc で perlintro を読む事
511 名前:507 mailto:sage [2010/06/01(火) 06:24:42 ] >>509 そうですか。うーん。 正規表現とか、考え方とかはそんなに変わらないかと思ったんですが、 有害なんですね。 できれば、オンラインで学習できるのが一番なんですが、まとまったサイトってありますか? >>510 ありがとうございます。 でも読むコマンドがわかりませんでした。 私は、Macなので、ターミナルを起動して >perldoc perlintroとコマンドを入力してみましたが、 perlintroというドキュメントはないというようなエラーが出ました。 No documentation found for "perlintro".
512 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 07:15:01 ] >>511 perldoc.perl.org/index-overview.html www.perldoc.jp/docs/perl/ >>2
513 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 08:34:09 ] >>511 サンプルコードによるPerl入門 d.hatena.ne.jp/perlcodesample/ 日本の Perl ユーザのためのハブサイト perl-users.jp/
514 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 14:55:03 ] qb5.2ch.net/test/read.cgi/saku2ch/1269144264/183 2010/04/01 21:55:59 HOST:softbank221101001151.bbtec.net qb5.2ch.net/test/read.cgi/sakud/1268731363/209 2010/04/13 22:40:00 HOST:softbank221101001151.bbtec.net qb5.2ch.net/test/read.cgi/sakukb/1267978152/196 2010/04/16 23:34:20 ID:GYnmPEAj0 qb5.2ch.net/test/read.cgi/sec2chd/1274948647/904 2010/05/30 16:54:09 ID:NuvDjPvV0 schiphol.2ch.net/test/read.cgi/stadium/1252943434/687 2010/04/01 22:00:01 ID:mB5AiSFL schiphol.2ch.net/test/read.cgi/tennis/1269837495/27 2010/04/01 22:01:15 ID:+EaxE3Yd schiphol.2ch.net/test/read.cgi/sports/1269560639/78 2010/04/13 22:44:20 ID:bew0Nrvf schiphol.2ch.net/test/read.cgi/sports/1268430764/294 2010/04/14 09:35:45 ID:hjGULPLG schiphol.2ch.net/test/read.cgi/war/1270527178/319 2010/04/14 18:23:30 ID:+lNQ2DXA schiphol.2ch.net/test/read.cgi/kyozin/1270206821/91 2010/04/14 18:29:06 ID:3CDN5Ccw0 schiphol.2ch.net/test/read.cgi/wres/1270861626/47 2010/04/14 18:30:38 ID:9IsRU2FN0 schiphol.2ch.net/test/read.cgi/ski/1268925479/573 2010/04/16 23:39:04 schiphol.2ch.net/test/read.cgi/goveract/1259841553/510 2010/04/18 17:31:32 ID:pk5WfpDm schiphol.2ch.net/test/read.cgi/gutter/1264177302/517 2010/04/18 17:34:51 ID:34DVdrjm schiphol.2ch.net/test/read.cgi/stadium/1251865219/707 2010/05/10 22:44:12 ID:hX93YGf3 schiphol.2ch.net/test/read.cgi/cancer/1268747646/273 2010/05/10 22:46:25 ID:nHvjUfwZ schiphol.2ch.net/test/read.cgi/sports/1260967753/636 2010/05/11 18:17:35 ID:yYc33zVj schiphol.2ch.net/test/read.cgi/war/1271752424/342 2010/05/16 18:50:43 ID:6cddBk0z schiphol.2ch.net/test/read.cgi/war/1243407044/217 2010/05/30 16:50:31 ID:2FL8NGA8 schiphol.2ch.net/test/read.cgi/equestrian/1231931323/760 2010/05/31 21:06:11 ID:34qn98Gz
515 名前:507 mailto:sage [2010/06/01(火) 22:30:15 ] >>512 >>513 丁寧にありがとうございます。 無事Perlintroを読み終えることができました。 まだデータ形式のハッシュはよく理解していませんが、少しずつ理解しようと思います。 サンプルコードによる・・には、新しい版用のコードの書き方の解説もあったので、 今持っている初めてのPerl本と見比べながら学びたいと思います。 ありがとうございました!
516 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 16:42:25 ] 2ちゃんねるにアクセスしたいんですがもうずっと人大杉となってしまいます。 回避する方法はありますか?
517 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 16:55:32 ] まず服を脱ぎます。
518 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 18:23:10 ] 脱ぎました。 次はどうすればいいですか?
519 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 18:50:55 ] >>518 口に鉛筆を咥える。
520 名前:デフォルトの名無しさん mailto:sage [2010/06/03(木) 19:02:34 ] マジレスすると2chはUser-Agentがlibwww-perlとかだと弾くようになってる
521 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 11:05:28 ] 文字列をutf8からsjisに変換するのに、jcode を使用すると特定の文字が変換されずに?になってしまいます。('1〜5' → '1?5') 正しく変換するにはどのようにすればよいのでしょうか。 #!/usr/bin/perl use Jcode; my $utf = "1〜5"; my $sjis = jcode($utf)->sjis; my $euc = jcode($utf)->euc; print jcode($sjis)->utf8 . "/" . $utf . "/" . jcode($euc)->utf8;
522 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 11:28:59 ] >>521 すみません。自己解決しました。 use Jcode; を use Jcode::CP932; に変えるだけでした。
523 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 11:35:22 ] 昔の人がユニコードと既存の文字コードの対応関係を決めるときに 統一に失敗したので面倒なことになってます。ほんと迷惑。
524 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 11:02:37 ] Apache2+mod_perlやってるんですが、 その回のリクエストが終わっても残り続けるグローバルな変数って ありますか? メモリ上に残り続けるフラグを持ってリクエストのたびに処理を分岐したいです。
525 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 11:13:11 ] >>524 ファイルか、DBに残せばよいのでは?
526 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 11:40:52 ] アクセス数(マルチスレッド)が半端ないので ファイルはなるべく避けたいです。 フラグ一つのためにDB構築するのもなんか微妙なので。
527 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 11:51:05 ] IPC::ShareLiteとか使うのがいいんじゃね?
528 名前:デフォルトの名無しさん [2010/06/09(水) 11:53:33 ] printf "%.2f\n", 90.1730; printf "%.2f\n", 90.1740; printf "%.2f\n", 90.1750; printf "%.2f\n", 90.1760; printf "%.2f\n", 90.1770; printf "%.2f\n", 90.1630; printf "%.2f\n", 90.1640; printf "%.2f\n", 90.1650; printf "%.2f\n", 90.1660; printf "%.2f\n", 90.1670; この処理ですが、上の段は、5捨6入しているのですが、 下の段は4捨5入の処理をしています。 90.17 90.17 90.17 90.18 90.18 90.16 90.16 90.17 90.17 90.17 いろいろと試したのですが、printfがどういったルールで 丸めの処理をしているのかまったくわかりませんでした。 ググッてもこの処理の違いに関する説明もでてきません。 この処理の違いがわかる人はいませんか?
529 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 12:08:50 ] >>528 内部は2進数なので、2進数だと無限小数になっちゃう 数は有限桁数で表すと誤差が出るんだよな。 もう少し先の桁まで出すと % perl -e 'printf "%.20f\n", 90.1750;' 90.17499999999999715783 なので四捨五入だと切り捨ての方になっちゃうんだよね。
530 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 12:09:59 ] >>526 なら、WebPage側にhidden項目でも作って、そこに保存しておくとか・・・
531 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 12:22:41 ] mod_perlは使ったことないけどmod_speedycgiなら……
532 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 13:35:48 ] >>530 ?
533 名前:デフォルトの名無しさん [2010/06/09(水) 16:10:35 ] >>524 グローバル変数で変数を持たせるとセッションが続く限り、内部データは引き継がれる。 これはspeedycgiでも同じ。 普通は変数が引き継がれると困るので、局所変数で宣言するが、普通のcgiだと、cgiが 実行されるごとに、グローバル変数はリセットされるため、局所でもグローバルでもあま りあまり関係ない。そのため後からuse strict;で変数管理をしようとしてもエラーだらけで、 直しようがなくなる。
534 名前:デフォルトの名無しさん [2010/06/09(水) 22:41:24 ] use strict するとエラーが発生するCPANモジュールは登録しないで欲しい。
535 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 00:15:55 ] >>534 まさかstrictにrefs入れてないよね?
536 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 02:01:07 ] use stritc; しておいて必要なところだけブロック切って no strict 'refs'; だろjk
537 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 12:14:48 ] >>534 obsoleteなブツなんでないの? 同等以上の新しいモジュールがあるだろ。
538 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 17:21:59 ] test.txt文書内にある abc001.jpg abc002.jpg という2行の文字列を <Vol.001>abc001.jpg <Vol.002>abc002.jpg と書き換えてoutput.txtに書き出すPerlスクリプトを書きたいと思っています。 しかし、test.txt内の文字列が1行の場合には上手くいきますが、 例のような複数行では <Vol.001>abc001.jpg abc002.jpg となってしまいます。 どこが間違っているのでしょうか? #!/usr/bin/perl use strict; use warnings; $a="test.txt"; $b="output.txt"; open my $in , '<', $a or die "Cannot open '$a': $!"; open my $out, '>', $b or die "Cannot open '$b': $!"; while(<$in>){ s/abc(.+?)\.jpg/<Vol\.$1>abc$1\.jpg/; print $out $_; }; close($in); close($out);
539 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 17:55:00 ] そのままコピペしたけどちゃんと動いたぞ? あと関係ないけど、せっかくuse strictしてるんだから$a , $b はつかうな
540 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 20:11:20 ] 配列の宣言についての質問なんですが my @x=(1,2,3,4,5,6,7,8); my $y=100; my @pi =(@x/$y); この様に@で配列を制限し my @piの中身を1/100,2/100,3/100,4/100,・・・ として以下の計算につなげたいのですが、 どうしても上手くいきません・・・ foreach文なども試してみましたがダメでした 非常に低レベルの質問ですがどうかご教授よろしくお願いします
541 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 20:19:29 ] my @x=(1,2,3,4,5,6,7,8); my $y=100; my @pi; foreach my $tmp (@x){ push(@pi, $tmp/$y); } foreach my $tmp (@pi){ print "$tmp, "; }
542 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 21:06:34 ] key1, key2, ..., keyN, Value (N=10程度) のようなレコードを持ったCSVファイルに対して, keyA=AAAかつkeyB=BBBのレコードのValueの合計,平均,...etc といった統計を計算する最もスマートな方法を教えてください. レコード数は数十万〜数百万行を想定しています.
543 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 21:38:31 ] >>524 ourで宣言すればおk。 でも保持できるのはプロセス単位だから共有メモリ使った方がいいと思う。storableとか
544 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 22:03:32 ] >>540 perldoc.jp/docs/perl/5.12.1/perlfunc.pod#item_map_BLOCK_LIST_map my @pi = map $_ / $y, @x;
545 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 22:19:50 ] my @pi = map {$_ / 100} (1 .. 8); print "$_, " for (@pi);
546 名前:540 mailto:sage [2010/06/10(木) 23:13:47 ] >>541 、>>544 、>>545 わざわざ理解しやすい回答ありがとうございます 早速スプリクトに組み込んでみます
547 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 00:01:18 ] >>542 その数ならDBに突っ込んでSQLでやる
548 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 00:24:13 ] 合計と平均なら頭から読んで足したり数えたりするだけで いいと思うけど。
549 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 03:47:48 ] >>539 コメントありがとうございます。 問題点は、入力用ファイルの改行コードでした。 改行コードをUnixではなくMacの改行コードにしていたので、 2行が1行と認識されてしまっていたようです。 ずっと正規表現の問題だと思っていたので、コメントのおかげで別の観点で見直すことができました。 素人なのでもう一つ質問させてください。 >$a , $b はつかうな というのは、意味のない変数名を使うのではなく、 $infile,$outputfileなどのように一目で意味のわかる変数名を使いなさいということでしょうか?
550 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 03:51:22 ] >>549 $aと$bはsortの時に使われる。つか、use strictしてるのにmyなしで動いてる時点で「あれ?」ってなったでしょ? perldoc -f sort > global variables $a and $b
551 名前:507 mailto:sage [2010/06/11(金) 06:33:39 ] >>550 丁寧にありがとうございます。 色々調べてやっと仰っていることが理解できた気がします。 やはり、初めてのPerl初版本を読んでいた弊害がありそうです。 でもこのサンプルコードによるPerl入門は素晴らしいですね。 d.hatena.ne.jp/perlcodesample/20091120/1246679588
552 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 18:38:48 ] 指定の処理を行いログを出力するプログラム hoge.plと そのログを読み込み解析し出力する analyst.plを作り、 普段はhoge.plを使いたまにanalyst.plを実行するという事をしてきました。 今回その解析済みログを利用するためにhoge.plの中でanalyst.plを実行させたくなったのですが require('analyst.pl');としたところ"\x{00cd}" does not map to cp932 at analyst.pl line 12. というエラーが大量に出ました。 これは両方のplファイルにuse utf8; binmode STDOUT ":encoding(cp932)";があり analyst.plでutf8からcp932に変換されたものがhoge.plでさらにcp932に変換されているからのようで analyst.pl内のbinmode〜;をコメントアウトするとうまく動くようになりました。 しかしanalyst.plの単独実行時にうまく動かなくなりました。 このような場合どうすれば両立させることができるのでしょうか?お知恵を貸して欲しいです。 This is perl, v5.10.1 built for MSWin32-x64-multi-thread
553 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 19:01:09 ] >>552 ちょっと面倒だけど新たにAnalyst.pmを作成し、そこにanalyst.plの機能を全部放り込んだサブルーチンを作り、 hoge.plとanalyst.plはそれを読み込み実行すれば両立出来るよ。 hoge.plとanalyst.plの二つのファイルだけでは・・・できるのかな?
554 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 20:02:21 ] >>553 そこまでするならモジュール化すればいいだろw
555 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 20:06:22 ] 試してないけど ':raw :encoding(cp932)' みたいにレイヤー重ねがけすればとりあえず動くんじゃね
556 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 20:43:23 ] >>552 requireする前にbinmode STDOUT=>":raw"; あるいはanalyst.pl内のbinmode文をbinmode STDOUT=>":raw:encoding(cp932)";
557 名前:552 mailto:sage [2010/06/15(火) 21:25:50 ] なるほど、:rawを重ねると生データにリセットできるんですね。 requireする前に一行追加することで簡単に実現出来ました。 呼び出し前に:rawにして呼び出し先で:cp932に再セットされるという流れもなんだか良いです。 >>553-556 みなさんレスありがとうございました。
558 名前:552 mailto:sage [2010/06/15(火) 21:54:21 ] このスレ雰囲気良いね
559 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 03:43:58 ] 一気に雰囲気が悪くなった
560 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 05:22:30 ] そんなこというなよ…
561 名前:デフォルトの名無しさん [2010/06/16(水) 17:53:09 ] perlスクリプトファイルのコメント部分だけ取得する良い方法はないでしょうか? 単純に # より前を消すみたいのを自分で作ってたんですが、print '#'; とか、s#a#b#; というのも考えられるなとか、ヒアドキュメント中の # はどうするとか、、、 私の脳みそでは確実に無理なので、なにかないでしょうか?
562 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 19:11:59 ] つ正規表現
563 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 19:59:14 ] m{ hoge # not comment } と m{ hoge # comment }x の区別とか想像しただけで嫌になるよなw
564 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 20:23:53 ] >>561 perltidyとかは?
565 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 20:30:46 ] $_ = '1"##"#a"'; print qq#\# match #, '#', "\n" if /"#a/ && m#[^\#]\##; # こめんと; { #" ですよ} 考えてみようとして例を作っただけでつらくなってきた
566 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 20:42:23 ] PPIとか使ってみれば? 正規表現の中のコメントは対応 できてないみたいだけど、他は結構いけるようだよ。
567 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 23:08:27 ] 正規表現のxオプション使ってる?
568 名前:デフォルトの名無しさん mailto:sage [2010/06/17(木) 00:40:40 ] >>561 Text::Balanced とかは?
569 名前:デフォルトの名無しさん mailto:sage [2010/06/17(木) 03:22:58 ] とりあえず#の後に;がない行を抜き出してみて、それでどれくらい引っかかるか見てみれば? 厳密にやろうと思えば何らかのPerlパーサを使わないと、正規表現でちょいちょいやるっていうのは無理だろうな。
570 名前:561 [2010/06/17(木) 10:33:00 ] >>562-569 ありがとうございます。なかなか難しいんですね・・。 気づいたのですが、秀丸とか(ほぼ)ちゃんとコメント色分け出来てますよね。 やっぱり偉大なソフトですね・・。
571 名前:デフォルトの名無しさん mailto:sage [2010/06/17(木) 11:57:22 ] どの辺までフォローしてるのかしらんけど Regexp::Common::commentとか