1 名前:nobodyさん mailto:sage [2011/09/09(金) 18:11:49.71 ID:???] Perlのコーディングで困ってる人のスレです。 【投稿する際の注意】 質問するときは内容をよく吟味してから投稿してください。 「コマンドの意味がわかんない」とかはマニュアル見ましょう。 回答者さんは何でも屋じゃありません。 1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。 最低でも1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。 お勧めサイトは >>2 以降 前スレ hibari.2ch.net/test/read.cgi/php/1295170172/
104 名前:nobodyさん mailto:sage [2011/09/26(月) 12:35:58.38 ID:???] トリップを生成する仕組みなんですが、 if (length $handle_pass >= 12) { my $mark = substr($handle_pass, 0, 1); if ($mark eq '#' || $mark eq '$') { if ($handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|) { $GB->{TRIPSTRING} = substr(crypt(pack('H*', $1), "$2.."), -10); } 文字列12バイト以上で、先頭が#または$の場合、 $handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|を行なって cryptによって生成していると思います。 しかし、$GB->{TRIPSTRING}や$1や$2をprintすると何も表示されません。 $handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|では何を行なっているのですか? 教えてください。
105 名前:nobodyさん mailto:sage [2011/09/26(月) 12:55:07.21 ID:???] >>104 関係ないけど、これ $ から始まる場合何もしてないよね
106 名前: ◆??? mailto:sage [2011/09/26(月) 13:01:10.88 ID:???] >>104 ##0123456789abcdefxx 形式のトリップキーかどうかのチェックだろ >>105 >>104 は書いてないけど実際はelseがある 2chでは今のところ単に予約としてとってあるだけらしいから???になるだけだけど
107 名前:104 mailto:sage [2011/09/26(月) 14:03:37.14 ID:???] >>105-106 ご回答ありがとうございます。 もう一度正規表現を調べますので、 その後、質問させてください。
108 名前:104 mailto:sage [2011/09/26(月) 17:00:08.24 ID:???] 先頭が#で始まり16進数文字が16個連続し、 末尾は./0-9A-Za-zのいずれかが0個以上2個以下連続する。 ですよね? #0123456789abcdefxxは真 #0123456789abcdefxxxは偽 #0123456789abcdefは真 #0123456789abcdefあ が偽なのは、なぜでしょうか? また、[[:xdigit:]]の[]が二重でくくられている意味を教えてください。
109 名前:104 mailto:sage [2011/09/26(月) 17:01:58.51 ID:???] すみません、書きこんで気づきましたが、 #0123456789abcdefも偽ではないのか?と思います。
110 名前:nobodyさん mailto:sage [2011/09/26(月) 18:06:25.07 ID:???] あ は [a-zA-Z0-9] かどうか f の後ろに続く判断が ? なのか + なのかで意味合いが変わってくるかと。 トリップキーの規格をもっかい調べてみればよいかと。
111 名前:nobodyさん mailto:sage [2011/09/27(火) 00:54:20.16 ID:???] ファイルのロックはmkdirなどでロック用ディレクトリ を作る方法は良く見かけますがディレクトリではなく openでロック用ファイルを作るというのは問題があるんでしょうか?
112 名前:nobodyさん mailto:sage [2011/09/27(火) 01:02:44.10 ID:???] rename とか mkdir はシステムコールを使ってるから、open より割り込まれる余地が少ない。 とかじゃなかったっけ?
113 名前:nobodyさん mailto:sage [2011/09/27(火) 01:31:29.84 ID:???] >>111 www.din.or.jp/~ohzaki/perl.htm#File_Lock 今時 flock を使えない環境に出くわす事も稀だがな。 perldoc.perl.org/perlport.html#flock
114 名前:nobodyさん mailto:sage [2011/09/27(火) 02:07:22.29 ID:???] モジュールを作ってて、そのモジュールの中では use utf8 とか、open(my $in, '<:utf8', '〜') とかしてます。 しかし use utf8 してないスクリプトから呼ばれた時には、これだと文字化けが起きてしまいます。 そのため use utf8 されていない場合にはフラグを落として返したいのですが、 モジュールを呼んだスクリプトで use utf8 されてるかどうか調べる方法はあるのでしょうか? モジュールが特定の文字コードに依存すること自体が駄目だとは分かっては居るのですが・・・
115 名前:nobodyさん mailto:sage [2011/09/27(火) 04:57:52.69 ID:???] >>112 余地が少ないんじゃなくて余地が無い、 つまり処理がアトミックでないとだめなんだよ。 「余地が少ない」んじゃ意味ないの。
116 名前:nobodyさん mailto:sage [2011/09/27(火) 11:02:16.14 ID:???] flock(XX, 2) でデッドロックが発生した場合はどうなるんでしょうか? あと、待ってる間は自動でsleepしてくれるんでしょうか? flock(XX, 6) で自分で実装するのとどちらが良いのか迷ってます。
117 名前:nobodyさん mailto:sage [2011/09/27(火) 19:02:14.19 ID:???] すいません。プログラムを定刻になると自動で実行するようにしたいんですが、できますか? レンタルサーバに置きます。 全体を無限ループをしてsleep()で休むというのを考えたのですが、無限ループは一番やってはいけないらしいですね。 あと検索するとすぐJavaScriptで自動更新する方法が出てきますが、 この方法だと時限以外にもCGIにアクセスされたときに実行してしまうと思います。 JavaScriptだけに実行させたいときはパーミッションをどう設定すればいいですか?
118 名前:nobodyさん mailto:sage [2011/09/27(火) 19:46:39.67 ID:???] >>116 >明白ではないものの、伝統的な flock の動作としては、ロックが得られるまで 無限に待ち続けるものと、単に勧告的に ロックするものの二つがあります。 >>117 cronのことを聞いてる?
119 名前:nobodyさん mailto:sage [2011/09/27(火) 21:07:32.00 ID:???] >>118 その説明を読んで具体的にどうなるのかが分からなかった 伝統的とか無限とか ・複数のプロセスが待ち状態になった場合に、次にロックを得られる順番は? ・デッドロックかかったらプロセスはどうなるのか ・待ってる間の負荷は この辺りが気になる。
120 名前:nobodyさん mailto:sage [2011/09/27(火) 22:48:37.67 ID:???] ・複数のプロセスが待ち状態になった場合に、次にロックを得られる順番は? システムにしか分かりません ・デッドロックかかったらプロセスはどうなるのか flock を待つオプションで呼び、他のプロセスが死ねばロックは外れるので先に進めますが、 mod_perlなどではプロセスは死なないのでflockは掛かったままになります。 なので、flockを呼ぶときは待たないようにしましょう
121 名前:nobodyさん mailto:sage [2011/09/27(火) 23:25:00.27 ID:???] flock呼んだ順番になるのか、ランダムになるのかの2択くらいかと思ったんですが、後者って認識でいいです? 無限に待ち続けるとあるんですが、待たないようにする方法もあるんでしょうか? あと、大量のプロセスが待ち状態になった場合の負荷も気になります。 大人しく待ってるんでしょうか?
122 名前:nobodyさん mailto:sage [2011/09/27(火) 23:54:57.99 ID:???] unlock時に起き上がったプロセスがロックを取れる LOCK_NBだ、ドキュメントぐらい読め sleep以外に何をするのか、それ以前にロック待ちが大量にある時点でどうか
123 名前:nobodyさん mailto:sage [2011/09/28(水) 01:15:39.74 ID:???] >>117 >>118 の書いているとおり通常はcronを使う。と思う。 > あと検索するとすぐJavaScriptで自動更新する方法が出てきますが、 「プログラムを定刻になると自動で実行」させるのにJavaScriptをどうやって使うの? 意味がわからん。 > JavaScriptだけに実行させたいときはパーミッションをどう設定すればいいですか? さらに意味がわからん。
124 名前:nobodyさん mailto:sage [2011/09/28(水) 01:29:17.95 ID:???] >>123 俺は最初、サーバサイドでjavascriptを動かすnode.jsのこと言ってるのかと思った。 cronを扱うためのapiもあるみたいだし。 perl関係ないけど。
125 名前:nobodyさん mailto:sage [2011/09/28(水) 02:00:23.29 ID:???] >>122 ありがとうございました。 LOCK_NB使わずに待たない方法があると勘違いしてました。 素直に自分で実装します。
126 名前:nobodyさん mailto:sage [2011/09/28(水) 13:39:10.69 ID:???] ファイルの読み書きでトランザクションを実現するモジュールを apache が標準で持ってくれるとありがたい
127 名前:nobodyさん mailto:sage [2011/09/28(水) 17:26:59.68 ID:???] ファイルの読み込みは@lines = <IN>で一括して配列に入れていますが while<IN>で1行ずつ読み込む方がいいんですか? 配列を引数にしたり戻り値にしたりする場合が多いから どうしても一括読み込みが多くなってしまいますが 一括読み込みだとそんなにメモリの負担になりますか? ていうか<IN>自体にもファイル全部のデータが格納されているんですよね?
128 名前:nobodyさん mailto:sage [2011/09/28(水) 18:31:25.70 ID:???] GB単位でファイルを処理する人間だと、while で回すなりの工夫は必要だけど、 今のご時世だったら、殆どの人は気にする事は無いでしょ。 >ていうか<IN>自体にもファイル全部のデータが格納されているんですよね? そんなスーパーな挙動を取られたら、5GBファイルを 2GB メモリの PC で解析 出来ないじゃないですかっ
129 名前:nobodyさん mailto:sage [2011/09/28(水) 21:17:17.61 ID:???] 一行づつ読み込んだら遅くなる。
130 名前:nobodyさん mailto:sage [2011/09/28(水) 22:32:03.45 ID:???] % perl -le '$s = q{x} x 1000000 ; $s =~ s/(.{1,50})/$1\n/g; print $s ' > test.txt % cat hoge.pl use Benchmark qw( timethese cmpthese ) ; cmpthese timethese ( undef, { arr => sub { open my $fh, q{<}, q{test.txt} ; my @arr = <$fh> ; close $fh ; @arr }, whi => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; while (<$fh>){ push @arr, $_ } close $fh ; @arr }, aho => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; for (<$fh>){ push @arr, $_ } close $fh ; @arr }, }); % perl hoge.pl Benchmark: running aho, arr, whi for at least 3 CPU seconds... aho: 3 wallclock secs ( 2.76 usr + 0.35 sys = 3.11 CPU) @ 48.87/s (n=152) arr: 3 wallclock secs ( 2.72 usr + 0.41 sys = 3.13 CPU) @ 56.55/s (n=177) whi: 3 wallclock secs ( 2.85 usr + 0.30 sys = 3.15 CPU) @ 70.79/s (n=223) Rate aho arr whi aho 48.9/s -- -14% -31% arr 56.5/s 16% -- -20% whi 70.8/s 45% 25% --
131 名前:nobodyさん mailto:sage [2011/09/28(水) 22:55:36.32 ID:???] >>130 コメントは大事だよー whileが一番速いのか 理由は何なんだろうな
132 名前:nobodyさん mailto:sage [2011/09/28(水) 23:04:50.68 ID:???] whileでファイルの2行目から読み込むのってどうやるんですか?
133 名前:nobodyさん mailto:sage [2011/09/29(木) 00:01:53.09 ID:???] <FH>; while (<FH>) { }
134 名前:nobodyさん mailto:sage [2011/09/29(木) 00:44:49.60 ID:???] >>131 ファイルがメモリにキャッシュされたから。 最後に書いたほうが早くなる。
135 名前:nobodyさん mailto:sage [2011/09/29(木) 00:45:39.00 ID:???] 訂正 最後に処理されたもののほうが早くなる。
136 名前:nobodyさん mailto:sage [2011/09/29(木) 00:54:10.24 ID:???] 最後も何も2回目以降同じじゃね 仮にキャッシュされてるんなら
137 名前:nobodyさん mailto:sage [2011/09/29(木) 01:02:01.08 ID:???] >>135 適当に順番入れ替えてやってみ。 結果はほとんど変わらないから。 ていうかよく見たら一番最後に処理したahoが一番遅いじゃねーか。
138 名前:nobodyさん mailto:sage [2011/09/29(木) 01:09:34.61 ID:???] やっぱり一度に全部読んだほうが2倍以上速かったな。 all => sub { open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')); close $fh ; return split("\n", $buf);},
139 名前:nobodyさん mailto:sage [2011/09/29(木) 01:35:54.32 ID:???] 一度に全部読んだほうが処理がしやすい場合が多い ファイルの下に行くほど新しい書き込みの場合 最新のn件を表示する場合はwhileで1行ずつは難しいな @linesに全部読み込んで@linesの配列の後ろからn番までを切り取って表示すれば簡単だな
140 名前:nobodyさん mailto:sage [2011/09/29(木) 01:40:46.41 ID:???] 結局のところ「用途による」だろ
141 名前:nobodyさん mailto:sage [2011/09/29(木) 01:53:22.20 ID:???] >>139 ファイルの最後の方から読んでいって 改行の数を数えたほうが早いよ。
142 名前:nobodyさん mailto:sage [2011/09/29(木) 02:22:14.02 ID:???] ファイルの最後の行から上の行に向かって1行ずつ取り出せるの? ファイル読み込み位置操作できるのseekしか見つからなかったが これ行単位じゃなく後ろからのバイト数なんだよな
143 名前:nobodyさん mailto:sage [2011/09/29(木) 02:39:16.38 ID:???] ゆとりか。作れよ。
144 名前:nobodyさん mailto:sage [2011/09/29(木) 04:40:11.37 ID:???] >>142 www.din.or.jp/~ohzaki/perl.htm#File_Reverse
145 名前:nobodyさん mailto:sage [2011/09/29(木) 06:43:00.87 ID:???] >>137 一応書いとくが、Benchmarkのサブルーチン実行は記載順じゃないぞ。 勝手にソートされる。 もちろん、135の意見に同意するわけでは無いが。 ahoが遅いのは、明白に(<$fh>)の時点でメモリに確保(無名配列への代入と同等) されてて、その後に@arrにpushしてるから、遅いの当たり前。 サブルーチンの名前が「アホ」な時点でネタだと分る。
146 名前:nobodyさん mailto:sage [2011/09/29(木) 07:40:54.50 ID:???] AWKのAの人ディスってんの……
147 名前:nobodyさん mailto:sage [2011/09/29(木) 08:22:35.67 ID:???] >>130 以下は自分の推測。 正しいかはわからない。 @arr = <$fh>;は、まずreadline関数内で、全行のリストが作られ、それが@arrにコピー されるので「@arr+全行リスト」のメモリを使う。 while (<$fh>){ push @arr, $_ }は、1行だけが$_に入るので、「@arr+1行分」のメモリ しか使っていない。 メモリ使用量の差が速度差に出たと。
148 名前:nobodyさん mailto:sage [2011/09/29(木) 11:31:16.87 ID:???] >>130 7.8MB のテキストファイルでぶん回してみた Benchmark: timing 10000 iterations of aho, arr, whi... aho: 1337 wallclock secs (1157.39 usr + 103.11 sys = 1260.50 CPU) @ 7.93/s (n=10000) arr: 1284 wallclock secs (1118.88 usr + 102.05 sys = 1220.92 CPU) @ 8.19/s (n=10000) whi: 921 wallclock secs (768.06 usr + 104.30 sys = 872.36 CPU) @ 11.46/s (n=10000) Rate aho arr whi aho 7.93/s -- -3% -31% arr 8.19/s 3% -- -29% whi 11.5/s 44% 40% --
149 名前:nobodyさん [2011/09/29(木) 16:22:24.12 ID:zOJkGfGB] sendmailとperlで質問です。 メールからプログラムを起動したくて色々設定を行っているのですが どうにも行き詰ってしまいました。 CentOSにwebminを入れて管理しています。 sendmailにエイリアスを利用してプログラムを起動しようとしているのですがうまくいきません。 とりあえず外部からのメールは受信出来ている状態です。 登録用のエイリアスにプログラムに送ると合わせてユーザーにもメール配信していますが そちらには届いている事を確認済みです。 smrshについてはリンクを設定済みでエラーは返ってこなくなりました。 この状態で簡単なプログラムを作成して動作確認を行おうとしたのですが プログラムが動きません。 #!/usr/bin/perl -- open(OUT, ">> datafile.txt"); print(OUT "動作確認\n"); close(OUT); 試しでこのようなコードを置いてるのですが動きません。 プロンプトから動作させた場合は正しくファイルに書き込まれています。 エイリアスの指定の仕方がまずいとかでしょうか? エイリアス名: "|/usr/bin/perl /var/www/html/プログラム名" のような感じで指定しています。 直接 エイリアス名: "|/var/www/html/プログラム名" としてもダメでした。 もしわかるかたがいらっしゃいましたらよろしくお願いします。
150 名前:149 [2011/09/29(木) 16:24:24.50 ID:zOJkGfGB] 追記 パーミッションは プログラム755 書き込み用ファイル666 としています。
151 名前:nobodyさん mailto:sage [2011/09/29(木) 16:36:26.36 ID:???] まずすべきことは、エラーログを見てみる。
152 名前:nobodyさん mailto:sage [2011/09/29(木) 16:41:31.46 ID:???] >>149 メールがサーバに届いているなら、/var/log/maillogかなんかに出ているログを確認するというのが基本です。 気になったのは、ファイルパス。シェル上ではログイン時にそのユーザー派のホームディレクトリにカレントパスがセット されますが、sendmailで受けた場合はそのパスにならないのだから、絶対パスで指定する必要があります。
153 名前:nobodyさん mailto:sage [2011/09/29(木) 16:41:44.87 ID:???] > open(OUT, ">> datafile.txt"); この datafile.txt はどのディレクトリに書き込まれるの? パーミッションエラーで書き出せないとかじゃないの?
154 名前:149 mailto:sage [2011/09/29(木) 16:59:53.15 ID:???] >>152 ,153 盲点でした絶対パスで書いたら問題無く書き込めてました。 ありがとうございました!
155 名前:nobodyさん mailto:sage [2011/09/29(木) 17:44:48.07 ID:???] 結局Perlは関係なかったね。
156 名前:nobodyさん mailto:sage [2011/09/29(木) 17:51:14.58 ID:???] せやろか?
157 名前:nobodyさん mailto:sage [2011/09/29(木) 21:10:32.23 ID:???] せのつくあれをやるなんていやらしい
158 名前:nobodyさん mailto:sage [2011/09/29(木) 21:45:52.72 ID:???] 最近じゃ、小学生どうしでもするんですってね、 せいくらべ。
159 名前:nobodyさん mailto:sage [2011/09/30(金) 03:01:50.06 ID:???] 投稿の表示の上にページ数を載せたい場合 最大ページ数=投稿数/1ページあたりの表示数の少数切り上げだから 投稿数がわからないと最大ページ数がわからないわけだから whileだと最初にwile(<IN>){$toukousuu++;}で投稿数出してそのあとwile(<IN>){表示}の 2回ループしなきゃならないけど@lines一括読み込みなら$toukousuu=@linesのforeach(@lines){表示}の1回ループですむ
160 名前:nobodyさん mailto:sage [2011/09/30(金) 03:40:56.53 ID:???] ∩___∩ | | ノ\ ヽ | / ●゛ ● | | | ∪ ( _●_) ミ j 彡、 |∪| | >>159 / ∩ノ ⊃ ヽ ( \ / _ノ | | .\ “ /__| | \ /___ /
161 名前:nobodyさん mailto:sage [2011/09/30(金) 09:23:13.25 ID:???] hibari.2ch.net/test/read.cgi/affiliate/1317192380/ akiyan降臨中w
162 名前:nobodyさん mailto:sage [2011/09/30(金) 12:34:30.65 ID:???] >>160 何で釣り扱いされているのかわからんw じゃあ例えばファイルの下から10番目までの行であるならばフラグを立てるという場合 while(<IN>){ $aaa = $toukousuu-10; if($count>=$aaa){ $flg = 1; } else{ $flg = 0; } $count++; } としなければならないが$toukousuuを求めるのはこれよりまえにwhile(<IN>){$toukousuu++;}とする必要が あるのはわかるだろ。 つまりwhileだとループを2回しなければならんのだよ
163 名前:nobodyさん mailto:sage [2011/09/30(金) 13:19:30.58 ID:???] | 〜〜〜〜〜〜〜〜|〜〜〜〜〜〜〜〜〜〜 >( c´_ゝ`) | | >( c´_ゝ`) J >( c´_ゝ`) | 〜〜〜〜〜〜〜〜|〜〜〜〜〜〜〜〜〜〜 | >( c´,_ゝ`) | J >( c´,_ゝ`) >( c´,_ゝ`)
164 名前:nobodyさん mailto:sage [2011/09/30(金) 18:04:53.60 ID:???] >>162 うん。そうだね。それで?それがどうかしたの? って感じ。
165 名前:nobodyさん mailto:sage [2011/09/30(金) 18:27:33.76 ID:???] >>164 だって2回ループするとその分重くなるじゃん
166 名前:nobodyさん mailto:sage [2011/09/30(金) 18:55:57.64 ID:???] >>165 どのみち全数読み込まなきゃいけないんだったらもちろん一括読み込みすればいいんだけどさ。 しかし重くなるのが嫌だったら投稿数などのインデックス情報の類は別途保存して、 独立して管理するという方法もあるぞ。 そうすれば $count = @array; みたいにいちいち配列の要素数を数えなくても済む。
167 名前:nobodyさん mailto:sage [2011/09/30(金) 19:33:37.65 ID:???] >>165 slurp の方が早いよって主張ならまだしも、、、 >>130 の結果が理解出来てないだろお前さん。 % perl -le '$s = q{x} x 1000000 ; $s =~ s/(.{1,50})/$1\n/g; print $s ' > test.txt % cat hoge.pl use Benchmark qw( timethese cmpthese ) ; cmpthese timethese ( undef, { arr => sub { open my $fh, q{<}, q{test.txt} ; my @arr = <$fh> ; close $fh ; printf STDERR "%d\n", scalar @arr ; for ( @arr ){ print STDERR; } }, whi => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; while (<$fh>){ push @arr, $_ } ; close $fh ; printf STDERR "%d\n", $. ; for ( @arr ){ print STDERR; } }, }); % perl hoge.pl 2> /dev/null Benchmark: running arr, whi for at least 3 CPU seconds... arr: 4 wallclock secs ( 2.00 usr + 1.23 sys = 3.23 CPU) @ 242.11/s (n=782) whi: 4 wallclock secs ( 1.95 usr + 1.29 sys = 3.24 CPU) @ 254.94/s (n=826) Rate arr whi arr 242/s -- -5% whi 255/s 5% --
168 名前:nobodyさん mailto:sage [2011/09/30(金) 20:14:25.09 ID:???] >>166 全部読み込むにしても一括読み込みだとメモリ食うよ 一行ずつ回す方がいい >>167 読んだけど意味が分からない
169 名前:nobodyさん mailto:sage [2011/09/30(金) 20:49:46.04 ID:???] 165の「重い」ってメモリの重さの話か? 速度の話だと誤読したわ。 速度だと既に結論が出てて、>>130 理解してれば、 while(<$fh>){ push @arr, $_ ; } が、@arr=<$fh>; より早いんだから、後の処理が同じなら何回ループ回そうが、 無関係。カウンタを自分で付けようが、 $. 利用しようが同じ。 メモリ? んなもん、同じファイルなら、 @arr =<$fh> ;だろうが、一行づつ回そうが誤差範囲だろ。 それを何回回そうが無関係。 @arr = do{ local $/ ; $buf = <$fh> ; split /^/ms, $buf ; なんかするんだったら多くかかるのは当然だけど。 sub myps { print `ps ux $$`}; myps; # お好きなコード myps; でもして差分取れば?
170 名前:nobodyさん mailto:sage [2011/09/30(金) 20:50:40.41 ID:???] ×@arr = do{ local $/ ; $buf = <$fh> ; split /^/ms, $buf ; ◯@arr = do{ local $/ ; $buf = <$fh> ; split /^/ms, $buf ; } ;
171 名前:nobodyさん mailto:sage [2011/09/30(金) 21:29:34.48 ID:???] 釣りにマジレス >>159 open my $fh, '<', 'hoge.pl' ; while ( <$fh> ){ } print "$.\n" ; while ( <$fh> ){ print } close $fh ; このコードを hoge.pl として保存して実行してみろ。 と言うことで、 >>167 165 の言う「2回ループ」は上のコード、好意的に判断しても 「ファイルハンドル開き直してのファイル読み込み2回」って意味だ。 あなたの突っ込みは通じない。
172 名前:nobodyさん mailto:sage [2011/09/30(金) 23:04:33.02 ID:???] あれ?まだやってるの? ほんとうの意味でファイルを一括で読むこっちが 一番速いって答えは出たと思うんだけど。 all => sub { open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')); close $fh ; return split("\n", $buf);},
173 名前:nobodyさん mailto:sage [2011/09/30(金) 23:07:07.88 ID:???] foreach ( split/\n/, $buf ) {} はい
174 名前:nobodyさん mailto:sage [2011/09/30(金) 23:11:26.42 ID:???] もうその話しじゃなくなってんだが、まあ突っ込んでやる。 同等の条件にすると話しにならんくらいarrの方が早い。 cmpthese timethese ( undef, { arr => sub { open my $fh, q{<}, q{test.txt} ; <$fh> }, all => sub { open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')) ; split(/^/ms, $buf);}, }); 結果↓ Benchmark: running all, arr for at least 3 CPU seconds... all: 3 wallclock secs ( 2.72 usr + 0.36 sys = 3.08 CPU) @ 1366.56/s (n=4209) arr: 4 wallclock secs ( 1.51 usr + 1.66 sys = 3.17 CPU) @ 30816.72/s (n=97689) Rate all arr all 1367/s -- -96% arr 30817/s 2155% --
175 名前:nobodyさん mailto:sage [2011/09/30(金) 23:13:06.26 ID:???] 174はまちがい スカラーコンテキストで評価されるわw
176 名前:nobodyさん mailto:sage [2011/09/30(金) 23:21:35.32 ID:???] まちがい。arrは遅かったw
177 名前:nobodyさん mailto:sage [2011/09/30(金) 23:22:41.29 ID:???] @arr =<$fh>がファイル一括読み込みよりも 遅いのは当たり前の話で、内部的に一行づつ読み込んでいるから。
178 名前:nobodyさん mailto:sage [2011/09/30(金) 23:23:54.55 ID:???] 同等の条件 arr => sub { my @arr = sub{ open my $fh, q{<}, q{test.txt} ; <$fh> }->() }, all => sub { my @arr = sub{ open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')) ; split(/^/ms, $buf); }->() }, まあ、 all の方が早いわな。
179 名前:nobodyさん mailto:sage [2011/09/30(金) 23:56:34.45 ID:???] 亠ァ厂| `':,;..:..:.';. ;'..:..:.,:' ‐个 兀 `:;:.::.':., ,':.::.:,:' `.:`.:''''..:.‐ :.:-:.:...,,,, __ 、‐-、 __ ,.‐z_,-、 '':;;:::':, ,...;'::..:,;' ,,.:': ..:..:...:..:..:...:...:...:.:..:...:...:..:.`_,,ノ └¬、'''.:.:‐:..,,ヾ、__)∠,ィク /,、 ';:''..:.:..:..:.:..:.'':;'':.:.,;. .:..:...:..:..:...:...:...:.:..:...:...:..:.ヾ、_ <^'".:..:..:.:..: <`ヾ´~_ _~´ 〉'''':.::.;':.::...:.:..:..:..:...:.:.';' ,, ..:..:...:..:..:...:...: ,,;,;,;,,;:..:..:.:.:..: / /\ `ヽ、..:..:.:..:..:_ブ∧ ‐ ‐ /.:.:..:,;,::';..:..:..:.:..:..:..:...:.:.:''´:.: :..:.:..:..,.:-〜' , 、m_)°.:.:.'ー-'..:..:..:`ー--',,;,;::.:.:ヽ、_i (_,/しヘヘ_) ´ '::;.:.::.:..:..:..:..:.:..,;'` '' ,;,,;,;/ <て_;:、。.:° ‐ '''' " ´ ´ ,;:''.:.:,:'' :;,._.:,;.,、:.'':.,,_ / r'7ァッーヘ、_) ゚ ,,:''.:.:,:'' , -〜''ヽ‐-‐、.:.:.'' -く レ'/〈 ° 。 ,ヘVフヽ、 ,,:''.:.:.:,:'' (_,ヘ、 ⌒ V巛〈 ヽ , 〜''ヽ / e ヽノ\ヘ. ,,:.''..::.:,:'' 。 と_刀Tゥー _/ ヾ ヽ、 Y ァ个〜'。゚ ,少ー- 代ヽ、 ヾゝ ,,.: '':.:/ヽ、' 。 ゚ (⌒⌒ー-く ノノ,!j {. \ Y巛〈 ) lfgレ゙く \''.:.::.:.:.:/ / 入 ゚ 。 `〜<ヾヾ、,`⌒ 〜 _, ヘ、 ヾ{ ヾト、 'ヾゝャgメl` ヾヨ /〃/ _,,> 〉〉ノ `厂丁` \ \ ヽ、 `ゞへmfi_ ゞdf‐ '' ´ //// ノ ─〜 ⌒ヽ、 \ ヽ、 ´`'‐ニ世三r<k´ _,,ノ,〆 / __,, へ、 \ ` ー- 、__ _,, --‐‐ ''´ _ - ´ /  ̄ ̄ \ ` ー- 、 _  ̄ ̄ ̄ _, -〜< -一 ブ ヽ、、  ̄` ー─----── ´ ̄ _ -一 ´
180 名前:nobodyさん mailto:sage [2011/10/01(土) 01:21:20.72 ID:???] >>179 話の流れを追う気はまったくないが このAAはおめでたさ満点でよかった
181 名前:nobodyさん mailto:sage [2011/10/01(土) 20:11:38.10 ID:???] 画像を送信するときなんかはフォームと画像のデータが1つになった 変数で送られるからwileで1行ずつ回すというのは無理だな こういう場合は画像が大きければ大きいほど、どうしてもメモリは食う
182 名前:nobodyさん mailto:sage [2011/10/04(火) 02:02:20.47 ID:???] >>182 まあそうだろうなmalti-partの場合も read(STDIN,$buff,$ENV{'CONTENT_LENGTH'}); で$buffに全部の送信データが格納されるから 画像が大きいほどメモリは食う
183 名前:nobodyさん mailto:sage [2011/10/04(火) 04:12:16.99 ID:???] >>182 再帰アンカー/ひとり循環リスト乙
184 名前:nobodyさん mailto:sage [2011/10/06(木) 12:31:19.56 ID:???] すいません read(STDIN, $data, $ENV{'CONTENT_LENGTH'}); print $data; だけのスクリプトを書いたんですが Use of uninitialized value in read at 〜と出ます これなんでですかね?
185 名前:nobodyさん mailto:sage [2011/10/06(木) 12:50:34.41 ID:???] >>184 perldoc.jp/docs/perl/5.10.0/perldiag.pod 本当にその2行だけなのなら、 -w オプションが効いている下で $ENV{'CONTENT_LENGTH'} を未定義のまま実行したからだろう。
186 名前:nobodyさん mailto:sage [2011/10/06(木) 13:13:47.41 ID:???] >>185 ありがとうございます。他のところがおかしいんじゃなくてよかったです。 これは入力がなければ出るものなんですね。
187 名前:nobodyさん mailto:sage [2011/10/06(木) 14:16:31.01 ID:???] >>186 > これは入力がなければ出るものなんですね。 違う。$ENV{'CONTENT_LENGTH'} が未定義 (undef) だから出ている。 STDIN からの入力が無くとも $ENV{'CONTENT_LENGTH'} に 0 が入っていれば出ない。 > Use of uninitialized value%s > (W uninitialized) 未定義値を、あたかも既に定義されているかのように使用しました。 > これは、"" か 0 と解釈されますが、間違いの可能性があります。 > この警告を止めるには、変数に定義された値を代入してください。
188 名前:nobodyさん mailto:sage [2011/10/06(木) 15:00:33.35 ID:???] >>184 この「だけのスクリプト」ってのは嘘だな。 CGIとしてだったらこの2行だけでは動かない。
189 名前:nobodyさん mailto:sage [2011/10/07(金) 00:00:35.18 ID:???] SSI使わずにHTML上にCGI呼び出す方法って<script>タグ以外にありますか?
190 名前:nobodyさん mailto:sage [2011/10/07(金) 01:23:00.44 ID:???] >>189 <script>タグ勘違いしてる。それはクライアント側での処理だから。 ttかHTML::Templateなどのテンプレートエンジンを考えてみたら。
191 名前:nobodyさん mailto:sage [2011/10/07(金) 03:51:57.20 ID:???] >>189 img、iframe、cssのimport
192 名前:nobodyさん mailto:sage [2011/10/08(土) 14:37:18.51 ID:???] https://github.com/motemen/WWW-BBS-2ch の make test は Result: PASS になり、 SYNOPSIS にあるコードを動かしてみたところ、 Can't call method "add_handler" on an undefined value at /usr/lib/perl5/site_perl/5.10/WWW/BBS/2ch.pm line 39. と出ました。なので 2ch.pm:39 を見ると、 https://github.com/motemen/WWW-BBS-2ch/blob/master/lib/WWW/BBS/2ch.pm my $class = shift; my $self = bless { ua => LWP::UserAgent->new(agent => "Monazilla/1.00 WWW::BBS::2ch/$VERSION"), encoding => 'shift_jis', @_, }, $class; $self->ua->add_handler( という感じです。 Dumper $self->ua; すると undef です。 エディタを開いて試しに自分で $ua = LWP::UserAgent->new(agent => "Monazilla/1.00 WWW::BBS::2ch/$VERSION"); $ua->add_handler( とか書くと $ua は取得できて add_handler も動くので CPAN モジュールは問題なく入っているようです。 my $self = bless {} が怪しいのですが、どうすれば WWW::BBS::2ch の SYNOPSIS を動かせるでしょうか。
193 名前:nobodyさん mailto:sage [2011/10/08(土) 17:51:50.13 ID:???] >>192 $self->{ua} で許して
194 名前:nobodyさん mailto:sage [2011/10/08(土) 18:24:39.39 ID:???] $self->ua; sub ua{ } は定義されてるの?
195 名前:nobodyさん mailto:sage [2011/10/08(土) 23:56:07.90 ID:???] >>192 どうも https://github.com/motemen/WWW-BBS-2ch の例が間違っているみたい。 | my $bbs = WWW::BBS::2ch->new(cache => $cache, ua => $ua); ここで $cache, $ua なんて存在しないから。 その通りに入力したら $self->ua は undef になるだろう。ためしに引数無しで | my $bbs = WWW::BBS::2ch->new; としたらどうだ。
196 名前:nobodyさん mailto:sage [2011/10/09(日) 16:35:15.15 ID:???] いまどきCGI.pmって見かけたけど、フレームワーク使えって意味だろうか。 わざわざフレームワーク通すまでもないときはどうするのがモダンなの?
197 名前:nobodyさん mailto:sage [2011/10/09(日) 17:53:18.28 ID:???] cgi-lib.berkeley.edu/ ん?いや、何でもない…
198 名前:192 mailto:sage [2011/10/09(日) 18:49:28.44 ID:???] >>195 うわああ、ありがとうございます! 動きましたぁばばばば。
199 名前:nobodyさん [2011/10/11(火) 23:38:30.50 ID:Xx0lESYm] 間違えて「プログラム技術板」に質問を書いてしまいましたが 此方で改めて質問させて下さい。 その1------------ DBIからのSqlサーバへの接続方法をご教示下さい。 質問場所がここじゃなかったら誘導お願いします。 以下の環境を作成し、 コマンドプロンプトからtest.plをCALLしたのですが SQLサーバがないとのエラーが表示され、接続出来ませんでした。 値を色々変えてみたりしたのですがどうやっても接続できず… 何が悪いのかお手上げ状態です。 接続文字列が悪いのでしょうか…? ODBCでの接続は行えており、CSEからのDB参照や コマンドプロンプトからのsqlcmdコマンドでなら正常にアクセスできます。 [sqlcmd /E /S PC-Name\SQLEXPRESS] 環境 ・Windows7 ・Microsoft SQL Server 2008 ・Perl5.0 Server:PC-Name\SQLEXPRESS DB:sampleDB User:user Password:pass
200 名前:nobodyさん [2011/10/11(火) 23:39:50.63 ID:Xx0lESYm] ----------------------- test.pl ----------------------- $dataSource = "dbi:ODBC:". "driver={SQL Server};". "Server=(local);database=sampleDB;". "Trusted_Connection=yes;". "AutoTranslate=No;"; #データベースに接続 $user="user"; #ユーザ名 $pwd="pass"; #パスワード $dbh = DBI->connect($dataSource,$user,$pwd) or die $DBI::errstr; # データアクセス(今は処理無し) $dbh->disconnect; ----------------------- エラー内容 ----------------------- DBI connect('driver={SQL Server};Server=(local);database=sampleDB;Trusted_Connec tion=yes;AutoTranslate=No;','user',...) failed: [Microsoft][ODBC SQL Server Driver ][Shared Memory]SQL Server が存在しないか、アクセスが拒否されました。 (SQL-08001 ) [state was 08001 now 01000] [Microsoft][ODBC SQL Server Driver][Shared Memory]ConnectionOpen (Connect()). (S QL-01000) at dbtst.pl line 28 [Microsoft][ODBC SQL Server Driver][Shared Memory]SQL Server が存在しないか、ア クセスが拒否されました。 (SQL-08001) [state was 08001 now 01000] [Microsoft][ODBC SQL Server Driver][Shared Memory]ConnectionOpen (Connect()). (S QL-01000) at dbtst.pl line 28. -----------------------
201 名前:nobodyさん mailto:sage [2011/10/11(火) 23:40:28.76 ID:???] 馬鹿には見えないtest.plが張ってあるらしいな
202 名前:nobodyさん [2011/10/11(火) 23:48:58.55 ID:Xx0lESYm] その3------------ 「その2」を付け忘れてしまいましたが 199-200でワンセットです。 Linux + MySql5.0 + DBIで動作しているシステムを 改造する為のローカルサーバを作成したいので、 どうしてもDBIを使用したいと考えています。 よろしくお願いいたします。
203 名前:nobodyさん mailto:sage [2011/10/12(水) 01:55:18.70 ID:???] > Server=(local); この表記はアリなのか?
204 名前:nobodyさん mailto:sage [2011/10/12(水) 04:13:51.23 ID:???] >>201 そうみたいだね。