Perlコーディング初心者質問スレ Part 50

このエントリーをはてなブックマークに追加
1nobodyさん
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
2nobodyさん:2006/06/26(月) 00:47:26 ID:???
関連スレ
CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/

【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc8.2ch.net/test/read.cgi/php/1034645635/

Perlモジュールについて
http://pc8.2ch.net/test/read.cgi/php/997829243/

CGIに依存しないPerlの話題一般/Part2
http://pc8.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 9 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1143834740/

【 スクリプト改造依頼スレ 】(丸投げ) part5
http://pc8.2ch.net/test/read.cgi/php/1141174205/
3nobodyさん:2006/06/26(月) 00:48:09 ID:???
4nobodyさん:2006/06/26(月) 00:49:09 ID:???
5nobodyさん:2006/06/26(月) 00:49:50 ID:???
6nobodyさん:2006/06/26(月) 00:50:46 ID:???
7nobodyさん:2006/06/26(月) 00:52:13 ID:???
8nobodyさん:2006/06/26(月) 00:53:27 ID:???
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
9nobodyさん:2006/06/26(月) 00:54:30 ID:???
10nobodyさん:2006/06/26(月) 01:02:34 ID:???
>>1
乙つつつ
11nobodyさん:2006/06/26(月) 10:30:20 ID:???
>>11

おちかれー
12nobodyさん:2006/06/26(月) 20:55:18 ID:???
1000取っちゃった。
オブジェクト指向より、いい指向ってないのかな。

大き目のプログラム組んで何ヶ月か、又は何年か後に見てみたら
全体の流れとそれぞれの処理を理解するのに数日かかってしまうのがいや。
これはオブジェクト指向とは無関係だけど。

プログラムを専門にやってないから思い出すのとあわせて、いつも
「なんでこんなイケてないんだこれ」
と自己嫌悪に陥る。

オブジェクト指向ってモジュールとか確かにべんりだけどさ。
完ぺき主義というか極端な自分としては全てをオブジェクト指向的にやろうとして、
うんざりする。

もっといいやりかたないのかね。

うんスレ違いだ。すみませんでした。
13nobodyさん:2006/06/26(月) 21:30:04 ID:???
>>12
それはプログラムの組み方の問題なんじゃないのかなあ。

プログラム組むときって、ノートに処理の流れとかメモするでしょ?
テキストエディタとかで
編集
 |- 検索
    |- 次を検索
    |- 前を検索
とかってあるけど、これもオブジェクト指向といえばオブジェクト指向だし。
編集::検索->次() みたいな。

これで例えば 「次を置換」 とか改造して入れるために、また一からプログラム全体を把握し直さなきゃわかんない、とかそーないと思うんだけど。
なんか変なとこにこだわりすぎてんじゃない?
14nobodyさん:2006/06/26(月) 21:48:52 ID:???
>>12
> 完ぺき主義というか極端な自分としては全てをオブジェクト指向的にやろうとして、
> うんざりする。
> もっといいやりかたないのかね。

Ruby 使っとけ。
15nobodyさん:2006/06/26(月) 22:04:56 ID:???
質問。
sub noward {
local($flag);
foreach ( split(/\s+/, $no_wd1) ) {
if (index("$in{'name'} $in{'sub'} $in{'comment'}",$_) >= 0) {
$flag = 1; last;
}
}
if ($flag) { $err .= "不適切な文字が含まれています。"; }
if ($err) { &error($err); }
}
禁止ワードのサブルーチンなんだけどコレを改行で区切る事が出来ないのだがどうすればいいのか教えてほしい。
お願いします。
16nobodyさん:2006/06/26(月) 22:19:27 ID:???
その前に、何を改行で区切りたいのでしょうか?そこが分かりません。
文からするとサブルーチンを改行で区切りたいように読めるけど…。
17nobodyさん:2006/06/26(月) 23:07:40 ID:???
kentっぽい書き方だな
18nobodyさん:2006/06/26(月) 23:26:42 ID:???
いまどきmyですむようなところにlocalだしな。

悪い癖をおぼえる前にもう少しましな手本を探したほうがいいような
気がする。

19nobodyさん:2006/06/26(月) 23:38:21 ID:???
kentはそろそろ後方互換性じゃなくて
古くてアレなスクリプトを配布する事による弊害を気にした方がいいね。
いまどきperl4だけの鯖なんてないし。
20nobodyさん:2006/06/27(火) 00:04:59 ID:???
当方C/C++/VBは使えますがPerlは難しいですか?
以前使っていたレンタル鯖がCのCGIを許可していたので
Cでゴリゴリ書いていましたが、別の業者に移管されてしまい
そこの業者はCのCGIが不可、Telnet不可とCGIが全て使えなくなってしまいました。
昔、ちょろっとPerlの本を見たことがあるのですが、コードがC以上に記号ばかりでゴチャっとしていて
追いにくいなぁと直ぐに本を閉じてしまった記憶があります。
C12年/C++3年/VB5年程です。。
 
21nobodyさん:2006/06/27(火) 00:10:32 ID:???
そんだけコード書いてればPerl覚えるのは余裕。
独特の癖があるので人のコードを読むのは苦労するかもしれんが、
書く分には好きなように書ける。

TIMTOWDIバンザイ
22nobodyさん:2006/06/27(火) 01:00:12 ID:???
それだけの経験があるなら1週間perlだけ弄ってればすぐに動くものが作れるt思います。たぶん。

sub内でローカル宣言した変数がリファレンス(Cでいうポインタ)で参照できちゃう気持ち悪い部分もあってw、
あまりに自由すぎるのがperlの欠点といったとこでしょか
23nobodyさん:2006/06/27(火) 01:15:43 ID:???
とりあえず文字列操作は正規表現メインで。
Cのポインタの概念は無いんで、文字列ポインタ動かしたりはできません。
だからといって文字列は配列でもないので、配列操作にもしないことです。

Cだけの人がとりあえず書いてみたPerlのプログラム読んだ事あるけど
思いっきりCぽくて、全然Perlじゃなかったなあ。

ていうか、Perlのソース読む方が理解が早いかも。
24nobodyさん:2006/06/27(火) 01:38:26 ID:???
まず変数の扱いとスコープの違いにつまづいて
次に構文の違い(elsifとかswitchとか)につまづいて
コンテキストの理解につまづいて
関数の仮引数が無いのにつまづいて
リファレンスをポインタだと思い込んでつまづいて

・・・がんばってください。
25nobodyさん:2006/06/27(火) 02:08:24 ID:ms3DPBt4
掲示板のプログラムを作っているのですが、
まず、書き込みページを出力して、
データを受け取って文法チェックをして 結果を出力して、
次のデータ受け取りでファイルに書き出しをするプログラムなのですけど、
どうしても原因が見つけれないエラーが出ていて困っています。
ただ、これ自体が大きすぎるので少し違うルートで質問します。

500 Internal Server Error
というのはどのような条件下で出てくるのでしょうか?
細かい説明などをくれるとうれしいです。

それともうひとつ
プログラムやルーチンの文法ミスもないし、ファイルの参照ミスもないのに
ファイル書き込み等をしているどこかでエラーが出てくる場合
どういうミスの可能性があるでしょうか?

ずいぶんと分かりにくくなってしまっていますが、お願いします
26nobodyさん:2006/06/27(火) 02:36:42 ID:???
よくこういう質問でるけど、なんで自分でわかんないんだろう?
文法ミスならローカルで実行したときわかるし、
違うなら処理の途中でためしに exit して、どこまでならエラーでないか、って突き詰めていけばわかるよな?

それでもどこもエラーないなら、
print "Content-type: text/html\n\n"; の前に何か print してる、くらいしか思いつかない。

>>25
要するに、知らんがな、ってこと。
ブラウザだけでやってんの? ちゃんとエラー文のせようよ。
27nobodyさん:2006/06/27(火) 02:52:04 ID:???
>>25
> ただ、これ自体が大きすぎるので少し違うルートで質問します。

お勧めしません。逆効果です。


> 500 Internal Server Error
> というのはどのような条件下で出てくるのでしょうか?

それが、CGI が何なのかを理解せずに書いたプログラムなら、ほとんどどのような条件下ででも。


> ファイル書き込み等をしているどこかでエラーが出てくる場合
> どういうミスの可能性があるでしょうか?

あらゆるミスの可能性、及び誰のミスでもない可能性があります。
どういうミスかはわかりません。ただ、「誰のミスか」であれば、この場合は控え目に言って 99.8% 程度の確立であなたのミスです。

# 助けてあげたくてもこの質問じゃ何もできないよぅ・・・orz
28nobodyさん:2006/06/27(火) 03:53:29 ID:H9M/RMpI
#! c:/perl/bin/perl

# CGIヘッダーの出力
print "Content-type: text/html\n\n";

# HTMLの出力
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";
print "<html>\n";
print "<head><title>Hello HTML</title></head>\n";
print "<body><p>こんにちは。これはHTML文書の例です。</p></body>\n";
print "</html>";

というCGIのプログラムがあったんですが
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";はどういう役割をしているんでしょうか??
29nobodyさん:2006/06/27(火) 04:05:08 ID:???
HTMLのDOCTYPE宣言。ValidなHTML文書作る時の常識。Perlとは直接関係ない。
板違いなのでWeb制作技術板へ行ってらっしゃい。
30nobodyさん:2006/06/27(火) 04:09:20 ID:???
> sub内でローカル宣言した変数がリファレンス(Cでいうポインタ)で参照できちゃう気持ち悪い部分もあってw、

何それ?
31nobodyさん:2006/06/27(火) 04:13:07 ID:???
>>30
こういう事かな。レキシカルな $s が外から見える。

sub hoge {
my $s = "ababababa";
return \$s;
}

my $s_ref = hoge();
print $$s_ref;
32nobodyさん:2006/06/27(火) 04:54:57 ID:???
それなかったらオブジェクトやクロージャもできないなあw
33nobodyさん:2006/06/27(火) 06:30:44 ID:???
>>25
基本的にCGIのエラーは500しか出ません。
パーミッションのミスでも文法ミスでも全て500が出ます。

>プログラムやルーチンの文法ミスもないし、ファイルの参照ミスもないのに
>ファイル書き込み等をしているどこかでエラーが出てくる場合
>どういうミスの可能性があるでしょうか?
例えば代入式の途中でexit()で終了した場合なんかは
perlがエラー→何も出力されない→500となったりします。
(が、たぶんそのエラーじゃ無い気がしますが・・・

要するに一度にいっぺんに書きすぎて、デバッグできなくなった状況ですよね。
=c
=cut
という技があるのでそれで半分づつエラーの範囲を絞ってみてはどうでしょうか?
(それ以前に全部コメントアウトしprint "\n\n"だけ書いて動くのかとかも要確認。
それが動けばそこから少しずつ増やしていけば何でエラーが起きてるのか特定できるはず・・・
34nobodyさん:2006/06/27(火) 08:42:29 ID:???
>>25
perl -c の結果をうpしてよ。
35nobodyさん:2006/06/27(火) 08:46:11 ID:???
>32
static宣言見たいのがあればなぁ・・・と思うわけですよ
36nobodyさん:2006/06/27(火) 09:41:13 ID:???
>>35
そこで Tie::Static ですよ。
37nobodyさん:2006/06/27(火) 14:12:21 ID:XmLciTUK
1: 自分はこういう事がしたい。
・ファイルがなければ新規にファイルを作成し$dataAを書き込んでから$dataBを書き込む。
・ファイルがあれば(すでに$dataAは書き込み済みなので)$dataBを書き込む。

2: それでこんな風にやってみたが・・・
unless ( -e $file ) {
open ( OUT , "> $file" ) or die;
flock ( OUT , 2 );
seek ( OUT , 0 , 0 );
print OUT $dateA;
truncate ( OUT, tell ( OUT ) );
close ( OUT );
}

open ( OUT , "+< $file" ) or die;
flock ( OUT , 2 );
いろいろ処理
seek ( OUT , 0 , 0 );
print OUT $dateB;
truncate ( OUT , tell ( OUT ) );
close ( OUT );

3: こんなエラーが出て上手く行かなかった。
エラーは出てないんですが、これって同時アクセスがあった場合に
ファイル壊れる可能性ないですか?
他に良い方法があればアドバイスよろしくお願いします。
38nobodyさん:2006/06/27(火) 14:45:28 ID:???
>>37
他にもある気がするが、-eしてから>でopenまでの間に割り込まれると壊れるな。
File::Tempで一時ファイルを作ってリネームするとよさげ。
3937:2006/06/27(火) 15:20:15 ID:???
>>38
やっぱり壊れる可能性ありますよね。

>File::Tempで一時ファイルを作ってリネームするとよさげ。
ありがとうございます。
一度それでやってみます。

他にもアドバイスがあればよろしくお願いします。
40nobodyさん:2006/06/27(火) 15:28:09 ID:???
ひとつロック用のファイルを用意しといて

・ロック用ファイルをロック
・ファイル存在チェック
・無ければ生成
・オープン
・処理
・書き込み
・ロック用ファイル閉じ

モジュール使わずコレでどうでしょう
4137:2006/06/27(火) 15:47:13 ID:???
>>40
アドバイスありがとうございます。

一連の流れを全てロックしてしまえ、ということですね。
ただ、ロックファイル自体が信用できるかどうか怪しい代物なので
ちょっと二の足を踏んでしまいます。
42nobodyさん:2006/06/27(火) 15:55:10 ID:cuOoVNQc
HTML内のフォームからファイルと時間を選択させて、
その時間になったら自動で指定ファイルをFTPで別サーバー
へ移動するという処理は可能でしょうか?
Perlでcrontabに書き出すことができればと思いましたが
レンタルサーバーでそれは許可されておりません。

cronを使用せずにperlにより指定時間になっているかどうかを
チェックして時間になっていたらFTPでファイルを移動
するような処理は可能なのでしょうか?

どなたかご存知の方居られましたら宜しくお願い致します。
43nobodyさん:2006/06/27(火) 15:57:12 ID:???
http://pc8.2ch.net/test/read.cgi/php/1024795138/
こっち行ったほうがいいかな。
44nobodyさん:2006/06/27(火) 16:10:04 ID:??? BE:353760858-#
もうcron関連の質問秋田
4537:2006/06/27(火) 16:32:46 ID:???
>>40
勘違いしてました。
flockでロックファイルをロックすれば良いだけでしたね。
ロックファイルが残り続けるのがちょっと気持ち悪いですが簡単に処理できるのは良いですね。

>>43
誘導先見ましたが、どちらかと言うとロックの追究が主のようで、例えば
open ( OUT , "+< $file" ) or die;
flock ( OUT , 2 );
いろいろ処理
seek ( OUT , 0 , 0 );
print OUT $dateB;
truncate ( OUT , tell ( OUT ) );
close ( OUT );
このコードのロック自体の有効性についての議論が中心のように見受けました。
わざわざ紹介していただいたのに不躾な言い分ですが、
私は上のようなロックでまず大丈夫という前提に立っているので
誘導先のスレよりもこちらで質問した方が適切だと思いますので
すみませんが、こちらに居させて下さい。
46nobodyさん:2006/06/27(火) 16:38:21 ID:???
>もうcron関連の質問秋田
そうおっしゃらずにどうかお願いします。
過去ログ見てみても無かったので…
47nobodyさん:2006/06/27(火) 17:35:31 ID:???
過去ログに何度も出てると思うよ。
cron使いたくない(or 知らない)けど定時的に何かしたいってのは。
48nobodyさん:2006/06/27(火) 17:36:54 ID:???
>>37
はじめの書き出しの方のseekとtruncateは別に無くても良いと思う
49nobodyさん:2006/06/27(火) 18:26:33 ID:???
ファイルをダウンロードした後、サーバ上から自動で消すことって不可能?
Locationでダウンロードするファイルに飛ばした後に
unlinkしてもダウンロードが始まる前にファイルが消えちゃう。
50nobodyさん:2006/06/27(火) 18:29:53 ID:???
ダウンロードがきちんとできたかどうか分からないけど
失敗してても消すのならできそう。
51nobodyさん:2006/06/27(火) 18:34:47 ID:???
>>49
そこでcronですよ。
削除リストファイルを作ってそこにあるファイルは定期的に起動するcgiで削除する。

で、ファイルのダウンロードはcgiから以外にはできないようにしておく。
一度ダウンロードしたものは2度とできないようにしておく。
52nobodyさん:2006/06/27(火) 18:35:11 ID:???
>>50
是非ご教示下さい!
53nobodyさん:2006/06/27(火) 18:40:24 ID:???
定期的に削除でいいのか??
Content-type: application/octet-streamで検索
5449:2006/06/27(火) 18:49:19 ID:???
>>51
やっぱりcronかぁ。
ダウンロード自体の頻度はかなり低い(月に数回程度)ので
すごく無駄な気がしてしまふ・・・。

>ファイルのダウンロードはcgiから以外にはできないようにしておく。
そんなことってできるんスか!?
refererでチェック?でも、簡単に偽装できるから意味ないか。

>一度ダウンロードしたものは2度とできないようにしておく。
これもやり方がさっぱり思い付かない。
パーミッション変更?
でも、いつダウンロードが終了したかは確認できんよな。
これもcron?って、それならパーミッションいじるより削除した方が早いよな。

>>53
ダウンロード頻度が低い、つまり削除の頻度も低いので
定期的に削除というよりは都度削除希望であります。
でも、無理なら仕方ない、といった感じであります。
検索して調べてきます。サンクス!
55nobodyさん:2006/06/27(火) 19:06:41 ID:???
そんなに頻度が多くないなら、Location使わずにCGI経由でダウンロードさせるようにすれば?
つまり、CGIがファイルを読み出して出力、全部出力したらファイル削除。

素のファイルには .htaccess などでアクセスできないように設定しておく。
56nobodyさん:2006/06/27(火) 20:19:59 ID:???
55の言ってるので出来ますね
print "content-type:MIME-type\n\n";
open fp,"downfile";
print <fp>;
close fp;
unlink "downfile";
ただしMIME typeをちゃんと指定しないと、textで無理やり表示されたり、めんどくさい感じ・・・
あと、ダウンロード→キャンセルでもうファイルが消えてるので、結構使いづらいかも?
.htaccess使うまでもなくパーミッションを600とかにしとけば普通に見えない。

ところで、UPは誰がどういう風にするのかが気になる・・・
それによってはもっといいアイデアがあるかも??
57nobodyさん:2006/06/27(火) 20:42:38 ID:???
いや、だから、>>53 が言ったみたいに
Content-Type: application/octet-stream

Content-Type: application/x-download
とでもしてDLさせればいいんでない?
5849:2006/06/27(火) 21:36:29 ID:???
Content-Type: application/octet-stream
とか初見だったんで最初はよく分からんかったけど。

ファイル読み込み

出力

ファイル削除

で出来ますた!サンクスであります。

>>56
それとほぼ同じ形に収まった・・・2時間以上かけてだけどw
UPは特定の仲間内(?)の任意の誰か、
またはすでにあるログから情報を抽出加工したものを新規ファイルとして作成、
という何とも分かりにくい感じ。深く気にしないでね。

ところで、少し気になったんだけど、
>>53>>55>>56>>57
の言おうとしてる内容はほぼ同じって解釈で合ってるよね??
59nobodyさん:2006/06/27(火) 21:54:28 ID:???
合ってる合ってる
6056:2006/06/27(火) 22:01:59 ID:???
>>57
なるほど、そういうmimeタイプがあるんですね。知らなかったです。
nameを指定するオプションとかも使えそうな感じ・・・(?
6149:2006/06/27(火) 22:38:41 ID:???
本題とちょっとズレるけど、
open直後にunlinkしても内容は保持されるみたいだね。
てか、UNIXなんかのテンポラリファイル使う場合は常套手段だとか。
>>56の例で言えば、
open fp,"downfile";
unlink "downfile";
print <fp>;
close fp;
って感じだな。
こうした方が、異常終了の際にファイルが消えてないってリスクが減るのでベターなわけだ。
62nobodyさん:2006/06/28(水) 00:23:47 ID:???
>>61
お前ぶっとばすよ?
63nobodyさん:2006/06/28(水) 00:32:55 ID:???
>>62
やめて
6425:2006/06/28(水) 00:51:27 ID:Ty2xiiJR
perl -c ではOKでエラーは見つからないです。
localでは、問題が見つからなかったのでサーバにアップロードしたらエラーが出まして
自分が考えれるところを確認しましたが、分からなくなってます。

ttp://hisazin-up.dyndns.org/up/src/11946.txt
再びいろいろといじっているせいで若干おかしなものも混ざっているかもしれませんが、
このような形です。
何の引継ぎなどがない場合には78行目の処理が行われて、
別ルーチンから投稿フォームが出力されます。
その投稿フォームから出力された場合に85行目からの処理が実行されて、問題がなければ
投稿OKかどうかの確認ページの出力
その確認ページからデータを引き継いだら143行目の処理に入るのですが、
143行目の処理の中で
ローカルでは問題なく結果が表示されるのですが、
サーバへアップするとどうしても500エラーとなってしまいます
65nobodyさん:2006/06/28(水) 01:54:52 ID:???
こりゃまたけったいなスクリプトがきたぞ
66nobodyさん:2006/06/28(水) 02:00:58 ID:???
67nobodyさん:2006/06/28(水) 02:05:10 ID:???
500エラーのときは鯖のエラーログ出せよ。

どうせヘッダ出力してないとかそういうのだろうけどな。
68nobodyさん:2006/06/28(水) 02:58:08 ID:???
sub nothing_log{
nothing_log: <<<これは一体?
print "その記事はすでに削除されているので書き込みできません\n";
exit;
}
69nobodyさん:2006/06/28(水) 03:28:54 ID:???
>>68
ラベル。
70nobodyさん:2006/06/28(水) 03:45:51 ID:???
>>25
まず、require文とhtml_head("掲示板")だけで動くのか報告よろ。
どうせ晒すなら全部晒してもらうとこっちでもテストできるんだけど・・・
71nobodyさん:2006/06/28(水) 03:58:15 ID:???
あ、わかった。143行目を print "\n\ntest\n"; で解決ですね。たぶん
あるいは html_head("掲示板"); print "test\n"; とか
82行目のifをスルーした場合どこにもヘッダを出力する
ルーチンがないので、普通にエラー・・・・・・・・・・・・
72nobodyさん:2006/06/28(水) 04:19:30 ID:???
・・・
form_vew_make($pop_name,$pop_title,$pop_msg,$pop_icon,$pop_color,$pop_password,$pop_mail,$pop_home,$pop_thread);
こういう代入はあまりにも毒々しいので、$popなんとかは全部1つのリファレンスにまとめた方がいい。
あるいは%FORMをそのまま放り込んで、$pop系の変数を全部捨てた方がいい。
$lenなんとかはlenごときで変数作るなよと、wその程度だったら
必要な時にlen_count($なんとか)で取れば十分。
あと$view_flagのgoとbackは、goとbackを代入してるif文のところで
そのまま処理すればよいので不要
73nobodyさん:2006/06/28(水) 08:40:19 ID:???
すみません。
BASIC認証するときのサーバの負荷について教えてください。
[ID]:[PASS]
というようなユーザファイルあると思うんですが、
何件ぐらい大丈夫なんでしょうか。
5万、10万件ぐらいは平気な感じでしょうか。
データベースでなく、ただのテキストファイルの検索って
どれぐらい大変なのかわかりません。

レンタルサーバじゃ実験できないし、
apacheのインストールの勉強も途中という
初心者ですので。
よろしくお願いします。
74nobodyさん:2006/06/28(水) 09:22:51 ID:???
>>73
perlの話じゃないので、スレ違い。使ってる鯖(apacheなり
なんなり)のスレを探してそっちできけ。
75nobodyさん:2006/06/28(水) 09:34:48 ID:???
板違い
76nobodyさん:2006/06/28(水) 10:04:15 ID:???
>>74
73です。
たしかに、1をよく読んだら全然違ってました。
初心者、perlつながりで質問してしまいました。

旅に出ます。><
77nobodyさん:2006/06/28(水) 17:08:53 ID:???
どこがperl繋がりなんだ…
78nobodyさん:2006/06/28(水) 17:13:29 ID:???
perlで.htaccessなり.htpasswdに追加アッー!
79nobodyさん:2006/06/28(水) 17:38:43 ID:JW7kjnCG
質問があるんですが「->」って何に使うんですか?
検索エンジンでは記号の検索ができないので、調べようにも調べられずに困っています・・・。
80nobodyさん:2006/06/28(水) 17:43:27 ID:???
>>79
「perl アロー演算子」辺りでぐぐる
81nobodyさん:2006/06/28(水) 20:12:24 ID:xzEYpxD8
デリファレンス
82nobodyさん:2006/06/29(木) 00:16:50 ID:???
$hoge->[10] $hoge は配列へのリファレンス
$hoge->{piyo} $hoge はハッシュへのリファレンス
$hoge->()    $hoge はコードブロックへのリファレンス
$hoge->piyo() $hoge はオブジェクト(メソッドコール)

っていう理解でいいですか?
83nobodyさん:2006/06/29(木) 00:18:42 ID:???
まぁ合ってる。
ただリファレンスじゃなくて
リファレンスの参照というか、デリファレンスというか
8482:2006/06/29(木) 00:33:58 ID:???
$hoge->[10] で要素が参照できるなら $hoge は配列へのリファレンス、というわけではないのでしょうか?
デリファレンスしてるのはアロー演算子ですよね?? 混乱してきた。。。
85nobodyさん:2006/06/29(木) 00:37:48 ID:???
ごめん、82を読み違えてた。
合ってる。$hogeは配列へのリファレンス。

86nobodyさん:2006/06/30(金) 00:52:51 ID:???
掲示板で無造作な大量リンクのカキコを排除したいと考えています。

  if( $txt にURLが5個以含まれる ){

    はじき処理

  }

の場合は、IF文のカッコ内にどのような文字を入れるとよろしいでしょうか。
よろしくお願いします。
87nobodyさん:2006/06/30(金) 01:03:46 ID:???
$text =~ m!(http://.*){5,}!s
とかでいいんじゃね
88nobodyさん:2006/06/30(金) 01:31:11 ID:???
>>87
なりました11111111
ありがとうございました   三 三 旦
89nobodyさん:2006/06/30(金) 10:18:19 ID:???
perl 5.8.6 で XML::RSS を使って Podcast 情報を取得しようとしていますが、enclosure url が引っ張り出せません。XML::RSS では出来ないようなのですが、他に enclosure url が取得できるものはあるでしょうか。m(_ _)m
90nobodyさん:2006/06/30(金) 10:41:50 ID:???
crypt関数について質問です。
#saltはランダムです
$crypted_pass = crypt($password, $salt);

$crypted_passは、$password='1111';$saltはランダムなので毎回違った
文字列になります。すごい疑問なんですが、これをBASIC認証のための
.htpasswdファイルに書き込むと、'1111'でも$crypted_passは毎回違う
文字列ができるのに、何回$crypted_passを作ってもBASIC認証の
ダイアログに'1111'を入れると認証されます。
すごいバカなので全然理解できないです。

わかりにくいとあれですので、やってみたいことを細くします。
フォームから入力されるパスワードを$FORM{'pass'}
.htpasswdファイルにすでに書いてあるパスワードを$pass_htpasswdとします。

パスワードが正しかったら〜するって言うことが目的なんです。
if( crypt($FORM{'pass'}, $salt) eq $pass_htpasswd){hoge処理;}
こういうことがしたい場合は、$saltを固定しないとperlでは
できないんでしょうか?固定するとこの処理で大丈夫みたいです。
ランダムだと毎回違う文字列が出てきてだめです。

サーバだとなんで、'1111'ってわかるんでしょうか。
perlでもなんか処理のしかたありますか。
ちょっと、長い文章で申し訳ないですが、よろしくお願いします。
91nobodyさん:2006/06/30(金) 11:28:55 ID:??? BE:238787993-#
ヒント:crypted文字列の前から二文字はsalt
92nobodyさん:2006/06/30(金) 12:01:59 ID:???
>>91
cryptの戻り値(digest)にはsaltの情報も含まれているのであとで確認したいときは
それをsaltとしてそのまま食わせればいいことになっている。

When verifying an existing digest string you should use the digest as the salt (like
"crypt($plain, $digest) eq $digest"). The SALT used to create the digest is visible as part of
the digest. This ensures crypt() will hash the new string with the same salt as the digest.
This allows your code to work with the standard crypt and with more exotic implementations. In
other words, do not assume anything about the returned string itself, or how many bytes in the
digest matter.

93nobodyさん:2006/06/30(金) 15:14:17 ID:???
>>91
>>92
90です。
ありがとうございます。
できました!!!

saltといっしょだったんですね。
cryptだとパスワードそのまま、saltにできるんですね。
すごく便利です。
ありがとうございました。
94nobodyさん:2006/06/30(金) 15:22:58 ID:???
なんか勘違いしてそうな文面だな。
95nobodyさん:2006/06/30(金) 16:17:19 ID:???
            第三者                  「通信は傍受される」のがセキュリティの前提で
             ↓
     受信     ↓傍受   送信          この場合、パスワードが傍受されるから
サーバー←←←[パスワード]←←←クライアント     生でパスワードを送るのはダメ


            第三者                 パスワードからハッシュ関数で生成した
              ↓                   ダイジェストを送信すれば、傍受されても
     受信      ↓傍受   送信          ダイジェストからパスワードは復元できない
サーバー←←←[ダイジェスト]←←←クライアント    (できるけど、とてつもなく時間がかかる)ので安全

ダイジェストを受け取ったサーバーは、自分が持っているパスワードをダイジェスト化して
それと送られてきたダイジェストを比べる事で、パスワードが合っているか判断する
っていう理解でおk?
96nobodyさん:2006/06/30(金) 16:20:58 ID:???
>>95
それだと、「ダイジェスト」を「パスワード」と読み替えたのと全く同じなのでよくない。
97nobodyさん:2006/06/30(金) 16:38:41 ID:???
下手な図だが。要はパスワードの平文をサーバに保存しないのがcryptの一般的な目的かと

 パスワード入力 ランダムなサルト
      ↓    ↓
crypt($password, $salt);
 ↓              登録時
保存(ダイジェスト化されたパスワード)
 ├──────┐    照合時
 ↓            │
照合           │頭にくっついているサルトだけが
 ↑            ↓    自動で取り出される。
crypt($password, $salt);
     ↑     パスワードとサルトが同じであれば
 パスワード入力     出てくるダイジェストが同じものになる
98nobodyさん:2006/06/30(金) 16:45:56 ID:???
なるほど。ダイジェストだけ保存しておけば、認証はできるのかぁ。
セキュリティは難しいです>< 結城たんのアリス本でも読もうかな・・・
99nobodyさん:2006/06/30(金) 17:07:50 ID:???
>>98
たん付けとは浩に失礼だ。
100nobodyさん:2006/06/30(金) 17:12:00 ID:???
>>94
90です
if( crypt($FORM{'pass'}, $pass_htpasswd) eq $pass_htpasswd){hoge処理;}
$saltの文字列が長いときは、crypt関数が、
頭から2文字saltを取ってきてくれて、.htpasswdに記録されている
パスワードをそのまま$saltに入れても大丈夫

っていうことかと思ったのですが。
違いましたでしょうか?
スクリプトは正常に動いてるみたいです。

よくわかりませんが、BASIC認証は通信を暗号化
しないとだめなんですよね。
たしか。
101nobodyさん:2006/06/30(金) 17:18:35 ID:???
>>100 勉強してきたようだな。
>>93
> saltといっしょだったんですね。
から>>100の意味は読み取れないぞ。
それに、書くなら、
crypt関数は$saltの先頭2文字をsaltとみなして計算するから、
とかするのが正しいだろう。

ロジックが重要なプログラムの世界で、言葉遣いぐらい、と思っているとひどい目に遭うぞ。
102nobodyさん:2006/06/30(金) 17:38:06 ID:??? BE:353760858-#
ミルカさん萌え
103nobodyさん:2006/06/30(金) 17:50:56 ID:???
正確には一概に頭二文字とはいえないな。ライブラリ依存。
POSIXやSUSv3の範囲で言えば確かにそうだけど、
拡張として$n$...$形式のsaltに対応している環境も結構ある。
ttp://www.gnu.org/software/libc/manual/html_node/crypt.html
ttp://www.freebsd.org/cgi/man.cgi?query=crypt&apropos=0&sektion=3&manpath=FreeBSD+6.1-RELEASE&format=html
104nobodyさん:2006/06/30(金) 18:21:42 ID:u4Lu+yYC
メールアドレス:[email protected]
### メール投稿設定 ###
@$tmail = '';# 投稿用メールアドレス
A$mailhost = '';# 受信メールサーバー
B$mailid = '';       # メールアドレス(@以下は入れないでください)

って言うのがあったんだけどそれぞれ何入れればいいんですか?
一応番号ふっときました
105nobodyさん:2006/06/30(金) 18:27:54 ID:???
>>104
Perlうんぬん以前の問題だな・・・

PC初心者板マジオススメ
http://pc7.2ch.net/pcqa/
106nobodyさん:2006/06/30(金) 18:28:48 ID:???
>>104
ここはスクリプトを「作る人」のためのスレだ。使う人はスレ違い。
作者に聞け。
107nobodyさん:2006/06/30(金) 19:33:30 ID:???
作者も聞かれても困るけどなw
108nobodyさん:2006/07/01(土) 00:20:37 ID:???
@$tmail = '[email protected]';# 投稿用メールアドレス
A$mailhost = 'pop.mail.yahoo.co.jp';# 受信メールサーバー
B$mailid = 'info';       # メールアドレス(@以下は入れないでください)
とでもやっておけばいいんじゃないの?
シラネ
109nobodyさん:2006/07/01(土) 15:05:13 ID:???
ページ移動させたいときに

print "Location: http://google.com/", "\n\n";

ってやるけど、windowsのローカル+Apache+ActivePerl だと 500エラー返しちゃうんだよね…
eval でもエラーにならないんで、
Location: ができるかどうかって前もって判断することってできる?
110nobodyさん:2006/07/01(土) 15:31:22 ID:??? BE:141504544-#
正常に飛びましたが何か?
111nobodyさん:2006/07/01(土) 15:50:23 ID:???
>>110
マジでΣ
何かの設定違ってんのかなー。

>>109 なんで &quot; になってんのかわかんないけど。

まあ、ぐぐったら tok2 とか infoseek とかでも Location は 500 るっぽいんだけど、
それは手動で設定変更して HTML吐いての meta タグで飛ばしてた。
プログラム内で自動で判断できれば一番なんだけど、何か対策ないかねえ。
112nobodyさん:2006/07/01(土) 16:43:35 ID:???
print "Status: 302 shine\n";
も一緒に吐くとどうなる?
113nobodyさん:2006/07/01(土) 16:44:34 ID:???
こうだったorz
print "Status: 302 Shine Compact\n";
114nobodyさん:2006/07/01(土) 18:13:25 ID:???
>>113
500だねぇ・・・。
動くとこでやってみたけど、何これ? マジック?
115nobodyさん:2006/07/01(土) 18:23:44 ID:???
print "HTTP/1.1 301 Moved Permanently¥n";
こいつを出してからにするとどう?
116nobodyさん:2006/07/01(土) 18:52:35 ID:???
>>115
おおおおお(*゜▽゜)

print "HTTP/1.1 301 Moved Permanently\n";


だといかなかったけど、参考にぐぐって、

print "Status: 301 Moved Permanently\n";
print "Content-type: text/html\n";
print "Location: http://google.com/\n\n";

こうしてやったらいきました! すごい! ありがとう!

……っていうか、ひょっとして Content-type: ないからあかんかった……?(;´Д`)
動くとこはなくても動いたんだけどw
117nobodyさん:2006/07/01(土) 19:08:37 ID:???
Content-Typeはどんなステータスでも必須だったような。。

>>115
それはnph-*なファイル名でないとあかんやん。
118nobodyさん:2006/07/01(土) 19:09:54 ID:???
>>114
CGI/1.1仕様でちゃんと決まってますよ。
119nobodyさん:2006/07/01(土) 19:13:14 ID:R0VHYefT
申し訳ないです。

鯖のインストール済モジュールが知りたくて、検索してたら↓の情報がありました。
ttp://antipop.gs/mt/2004/11/21/115534

ただこれを実行すると DBI など複数同一表示されるものがあるのですが、
これを重複をなくすにはどうすれば良いでしょうか?
120ヽ(´ー`)ノ ◆.ogCuANUcE :2006/07/01(土) 20:57:42 ID:???
use strict の後に my %c; を、for の後に grep { !$c{$_}++ } を入れるんだ。
121nobodyさん:2006/07/01(土) 21:38:28 ID:???
>>99
お前は呼び捨てかよw
122nobodyさん:2006/07/01(土) 23:52:40 ID:???
「9.56」みたいな、小数点付きの数字を画像表示させたいと考えているのですがよく分からず困っています。

小数点さえなければ
------------------------------------------------------
$cout = sprintf("%06d",$cout);

for($i = 0; $i < length($cout); $i++){
$no = substr($cnt,$i,1);
push(@image,"./img/$no.gif");
}

print "Content-type:image/gif\n\n";
binmode(STDOUT);
print &gifcat'gifcat(@image);
------------------------------------------------------
というコードで、数字を画像表示させられるというのは分かるのですが、
なにぶん小数点が含まれるとなると・・・・どうしたらよいか・・・・

ちなみに「img」ディレクトリに「0.gif〜9.gif」という数字の画像と
「point.gif」という小数点を表示する画像が入っています。

どうかよろしくお願いします orz
123nobodyさん:2006/07/02(日) 00:05:54 ID:???
>>122
未だにperl4なのがアレだけど…。多分、以下の1行入れるだけでいける。

for($i = 0; $i < length($cout); $i++){
 $no = substr($cnt,$i,1);
 $no = 'point' if ($no eq '.'); ### この行を入れる ###
 push(@image,"./img/$no.gif");
}
124122:2006/07/02(日) 00:29:28 ID:???
>>123
え・・・>>122は入門書っぽい本を参考にして組んだのですが・・・
何かまずかったでしょうか・・・?

とりあえずありがとうございました orz
125nobodyさん:2006/07/02(日) 04:58:17 ID:???
Image::Magickで「9.56」の画像を作ればいいんじゃね
126119:2006/07/02(日) 13:06:22 ID:???
>>120
ありがとうございました、希望の動作になりました。

Perl はコードが省略化されて読めなかったりするのですが、
119のリンク先では↓の部分が難解でした。もしよければ解説おねがいします。

print qq|<li><a href="http://search.cpan.org/search?module=$_">$_</a></li>\n|
for sort
map {$_ =~ m/^.+?"Module" (.+?)$/}
qx/perldoc perllocal/;

# printの行は↓に変更、最後にセミコロンを付けるとエラー
# print "<li><a href=http://search.cpan.org/search?module=$_>$_</a></li>\n"
# for sortの行は理解不能無理、こんなループ見たことない検索しても出てこない
# mapの処理自体は分かるが、左に代入先などがないので出力が分からん・・・
# qxは調べて分かった。でもどういう出力に・・・
127nobodyさん:2006/07/02(日) 13:35:34 ID:???
後ろから読んでくと分かるはず。

qx: qxの実行結果を
map: map に通してモジュール名だけ抜く
sort: ↑をソートして
for: そのそれぞれについて(foreach)
print: print
128119:2006/07/02(日) 14:16:29 ID:???
>>127
ありがとうございます、↓やっと分かってきました。

use strict;
my %c;
my @qx = qx/perldoc perllocal/;
my @module = map {$_ =~ /^.+?"Module" (.+?)$/} @qx;
my @modlist = grep { !$c{$_}++ } @module;
@modlist = sort @modlist;
foreach (@modlist) { print "<li>$_</li>\n"; }
129nobodyさん:2006/07/02(日) 17:13:00 ID:???
$_[0]って何だ?
エラーメッセージが一つしか表示されない。
もう一つ表示するはずなんだが・・・。

&error("ダメだ","ダメっす");
コレだと『ダメだ』しか表示されない・・・。
『ダメだ』と『ダメっす』をランダムってか表示させたいんだが
130nobodyさん:2006/07/02(日) 17:36:43 ID:???
>$_[0]って何だ?
配列の一番はじめの要素
>&error("ダメだ","ダメっす");
サブルーチンに配列で引数渡してるところ
>コレだと『ダメだ』しか表示されない
アタリマエ
131nobodyさん:2006/07/02(日) 17:38:40 ID:??? BE:106128162-#
sub error {
print $_[int(rand(scalar(@_)))];
}

我ながら酷いコードだな
132nobodyさん:2006/07/02(日) 18:36:42 ID:n0vd3nFA
ちょっと行き詰ってしまったので質問させてください

今回UTF-8を使用しようと思いjcode.pmでエンコードしようとしたのですが
一部の文字列が文字化けすることに気づきました。

例)心霊

ちなみにエンコード方法は
Jcode::convert (\$value, 'utf8');
としているだけで特に怪しいことはしていないと思います

ちなみにそこを#でコメントアウトしてみると
フォームページ自体をUTF-8で書いているため
さきほどの「心霊」と言った文字列も問題なく表示されるわけですが
フォームページをEUC-JPなどにすると
当然のごとくEUC-8になってしまうため問題があります

何か私自身の書き方に問題があるのでしょうか?
それとも仕様なのでしょうか?
お手数をおかけして大変申し訳ありませんがご教示頂けると嬉しいです

よろしくお願い致します
133nobodyさん:2006/07/02(日) 18:53:53 ID:???
129だが解決方法を教えてくれ
134nobodyさん:2006/07/02(日) 18:58:30 ID:???
せめて sub error を晒せ。
いまんとこ解決というかそれは当たり前というか。
>>130 も書いている通りなんだが。
>>131 もなんか書いてるし。
それを参考にどうぞ。
135nobodyさん:2006/07/02(日) 19:00:42 ID:???
>>131
配列の添え字は整数しかとらないんだし、
randの引数はスカラーコンテキストだからこれで良いじゃないか。
sub error { print $_[rand @_] }

>>132
何をしようとしているときに問題が発生するのかが良くわからんので、問題が発生するときの
・内部エンコーディング(UTF-8ならutf-8フラグはあるのかどうかも出来れば)
・出力/入力するエンコーディング
・どっちの方向に変換しようとしているのか
辺りを詳しく。

スクリプトの内部処理をUTF-8で行って、出力するページのエンコーディングを
EUC-JPにしようとしているわけ?勘では多分、使い方の間違いだ。
Jcode::convert(\$value, '変換先のエンコーディング', '元の文字列のエンコーディング');
ってやって見れ
136132:2006/07/02(日) 19:09:39 ID:n0vd3nFA
>>135
ごめんなさい、誤解させてしまうような書き方をしてしまいました

基本的には内部においてUTF-8で処理したいのです
eucやsjisに変換する気はありません

ただどんな文字コードでフォームから入力されても
UTF-8に変換したいために
Jcode::convert (\$value, 'utf8');
としています

# 現在のブラウザではフォーム入力ページがUTF-8なら
# UTF-8で文字コードを送信してくれるという話なので(どっかで聞きました)
# Jcode::convert (\$value, 'utf8');
# をしなくても実害はないといえば実害がないのですが
# 万が一sjisとかで送信してくるブラウザ等があった場合にも
# 対応したいと思い変換処理させています

ところでUTF-8フラグはEncodeモジュール以外でも必要なのでしょうか?
(今回の件で色々ぐぐっていたときUTF-8フラグというものについても読んだのですが
Jcodeモジュールを使う時にフラグ云々という話は出てこなかったので不要なのかと思っていました)

続きます
137nobodyさん:2006/07/02(日) 19:10:50 ID:???
Jcode::convert (\$value, 'utf8');

jcode($value)->utf8();
にしてみたら?
自動判別が働いて正しく格納されるはず。

入力のエンコードを誤認してたらどうしようもないけどね
138nobodyさん:2006/07/02(日) 19:11:56 ID:n0vd3nFA
入力された文字列を処理させる流れは以下のような感じです

sub decode {
my ($buffer, $key, $value);

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}

@pairs = split(/&/, $buffer);
foreach (@pairs) {
($name, $value) = split(/=/);

$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

Jcode::convert (\$value, 'utf8');

$in{$name} = $value;
}
}
139nobodyさん:2006/07/02(日) 19:16:54 ID:???
あの〜packしてる時点でスクリプトを書いている文字コードへ変換しているはずですが・・・

># 万が一sjisとかで送信してくるブラウザ等があった場合にも
># 対応したいと思い変換処理させています
そりゃおまいさんがどんなコンテンツを管理しているかによる。
UTF8で書かれたページからshiftjisで
しかもフォームデータをエンコードもせずにダイレクトで送ってくるブラウザ
使ってる奴なんて死ねばいいと思うよ
140nobodyさん:2006/07/02(日) 19:19:08 ID:???
139の一行目はなんか激しい勘違いなので忘れてw
141nobodyさん:2006/07/02(日) 19:23:43 ID:n0vd3nFA
>>137
jcode($value)->utf8();
にしてみたら上手く行ったかと思ったのですが
ためしにフォームページをEUC-JPにして入力してみると
入力された文字列はEUC-JPのまま出力されていました・・・

>>139
>しかもフォームデータをエンコードもせずにダイレクトで送ってくるブラウザ
>使ってる奴なんて死ねばいいと思うよ

もうちょっと正直に書きますと
ある分野のデータベースを作っているのですがその検索フォームを
「自分のサイトにつけたい人はどうぞ」
という風にしたいと考えているのです
ですのでその入力ページがeucもあればsjisもあるかと思うので
鯖側でUTF-8に変換したいなあと・・・

最後まで解決しなければその案は断念しますがw
142nobodyさん:2006/07/02(日) 19:47:20 ID:???
>>138
切り分けができてないな。そんなに長いプログラムではどこで
間違ってるか特定できないだろ。

Jcode::convertを疑うのなら、4valueにこの値をいれて
Jcode::convertを呼んだらこれこれこうなったけど
期待している値はこれだというのを示さないと。
143nobodyさん:2006/07/02(日) 20:06:33 ID:n0vd3nFA
>>142
えっと・・・このソースの大半は一般的な入力データ処理だと思いますが・・・
とりあえず>>132で書いた通り
Jcode::convert (\$value, 'utf8');
をコメントアウトすれば問題なく処理されます

一応文字化けした結果も載せておくと
「心霊」をUTF-8で記載されたページから入力すると
unpackされた値は「%E5%BF%83%E9%9C%8A」になりそれをpackして
Jcode::convert (\$value, 'utf8');
で変換すると「綽??」(← 文字化けしたもの)
となってしまうというわけです(当然期待している値は「心霊」です)

ちなみに「心」だけでも「霊」だけでも正常に出力されます
144nobodyさん:2006/07/02(日) 20:40:15 ID:???
いやだから??とか文字化けしたとかじゃわかんないでしょ。
utf8フラグと文字コードのダンプぐらい示さないと。
145nobodyさん:2006/07/02(日) 20:48:13 ID:???
ためしに
Jcode::convert (\$value, 'utf8', 'euc');

Jcode::convert (\$value, 'utf8', 'sjis');
ってやった結果も記してくれんかな
146nobodyさん:2006/07/02(日) 20:55:32 ID:???
そもそも他人に使わせるなら日本語限定ではだめじゃん?
ttp://www.russky.net/article/list.asp?id=855
これは gb2312 だけど euc-kr にも日本語のひらがなが入っていたようないないような。
147nobodyさん:2006/07/02(日) 21:13:47 ID:???
おおかたencode/decodeを適切にやってないと予想。

148nobodyさん:2006/07/02(日) 21:35:08 ID:???
ああ、大体わかった
「綽??」ってのはUTF-8の文字列をEUC-JPとして見たときのものだ。

つまり変換自体には問題はなくて、結果を表示するページを
間違えてUTF-8じゃなくEUC-JPにしてしまっている、と。
149nobodyさん:2006/07/02(日) 21:47:43 ID:pDw8h7zX
s/\x0D\x0A/\n/g;
tr/\x0D\x0A/\n\n/;
とかって、改行コードの統一処理はどのタイミングでやるもの?
何かファイルを読み込むごとに毎回するもの?
150nobodyさん:2006/07/02(日) 21:52:43 ID:???
混在してるとごちゃごちゃするので、なるべく入り口近くで決めた形式に
統一しちゃうね。場合によっては無駄になることもあるけどわかりやさ
優先。
151132:2006/07/02(日) 22:03:39 ID:n0vd3nFA
>>144
>>143の??は実際には文字化けの□をもっと縦長にした感じのが出ています
ただここにコピペしたら?に変換されてしまったわけで

>>145
入力ページはUTF-8で記載されていますのでその上での結果です
>Jcode::convert (\$value, 'utf8', 'euc');
「綽??」
>Jcode::convert (\$value, 'utf8', 'sjis');
「蠢?怺」
ちなみに↑の例ですが入力ページをそれぞれeucおよびsjisに変えたら問題ありませんでした
今回の「心霊」のようにそれぞれの文字コードで別の問題ある文字がないとは限りませんが・・・

>>146
そうかもしれません

>>147
その可能性がないとは言えませんが私は適切にやってるつもりなのでなんとも

>>148
ブラウザでのエンコードはUTF-8になっていることを確認した上で見ています
なのでブラウザの問題ではなくむしろ下に書くように
jcode.pmモジュールがUTF-8をEUC-JPに誤読しているのかと・・・

つづく
152132:2006/07/02(日) 22:04:39 ID:n0vd3nFA
今回試しに下のような形でエンコードしたところ
Jcode::convert (\$value, "utf8", "utf8");
正しく「心霊」と表示されました

また「心」と「霊」は単独で正確に表示できることから
思うに「心霊」と続けて入力したとき
繋がっている部分の文字列から文字コードをEUC-JPと判断された上で
UTF-8に変換しているのではないかと個人的には思っています

例) #文字コードについて調べるのが面倒なので下記のような仮定で・・・
UTF-8 : 心→aaaaaa 霊→bbaabb
EUC-JP : 綽→aaaa ?→aabb ?→aabb


今めちゃくちゃ眠いので
もしかしたら落ちてしまって反応明日以降になっちゃうかも・・・
そのときはごめんなさい

あと、忘れていたのですが、ご回答頂いた方々、ありがとうございます
153nobodyさん:2006/07/02(日) 22:07:24 ID:???
>>150
それは、
「コードの最初の方に1箇所だけ統一処理を置いて読み込む度に処理される」
ということを意味してるのか、
「必要不要は置いといて、オープンする度に毎回とりあえず統一処理する」
ということなのか、どっちの意味ですか?
読解力不足ですみません。
154148:2006/07/02(日) 22:27:28 ID:???
>>151-152
そうか、ごめん。こっちの環境ではちゃんと自動認識できてたもので、つい。

なら、SJISの一バイトカナの問題もあるし、
呼び出し元のフォームでエンコーディングを指定してもらうか、
もしくはフォームに適当なマルチバイト文字列を埋め込んでおいて、
それが何になったかでエンコーディングを調べるってのはどうよ。

# formにはaccept-charsetなんてのもあるのだけれど、IE対応してないんじゃ仕方ない…
155132:2006/07/02(日) 22:38:32 ID:n0vd3nFA
>>154
ご回答くださり有難うございます
なるほど、その方法がありましたね
ソース見られるとちょっと不恰好だけど・・・

てゆーか素朴な疑問なのですが
jcodeモジュールを使っている人で同じような問題に当たった人って居ないのかなあ・・・
eucで「〜」を入れるとNGというのは発見したのですが

# ちなみに入力ページをEUC-JPにした上で「〜」を入力したところ確かにNGでした

自分一人だとしたら、やっぱり何か私の書き方がおかしいんだろうな・・・
jcode.plではこんなこと一回もなかったのでjcode.pmが嫌いになりそう
156nobodyさん:2006/07/02(日) 22:45:18 ID:???
ってか受け取った文字列が utf-8 かどうかなんて自分で1行書いて判別すれば起こらない問題じゃね?
157nobodyさん:2006/07/02(日) 22:49:46 ID:???
143の%エンコードっされた文字列をみるに
Jcode::convertには

"\xe5\xbf\x83\xe9\x9c\x8a"

という「心霊」をutf8にしたバイト列を食わしているわけだが、
$Jcode::DEBUG=3にしてこいつを変換すると

>DEBUG:sjis = 6, euc = 2, utf8 = 6 at 〜

と出るので、sjisとutf8のスコアが同点でどっちにも決められない
状態になっていることがわかる。

これは避けられないことなので、普通はhiddenで判定用文字列を
渡してどういうのが来るかで文字コードを決定し、他のパラメタに
ついてはJcodeの自動判定にたよらずその文字コードを入力コード
に指定してやるのが安全。
158132:2006/07/02(日) 23:19:43 ID:???
ご回答頂きありがとうございます

>>156-157
なるほど、了解しました
とくに>>157さんは細かく調べて頂き深く感謝致します

>>154さんも仰っていたように
判定用文字列を渡してチェックする方向で対処したいと思います

長い時間お付き合い頂き、皆様、本当にありがとうございました
159nobodyさん:2006/07/02(日) 23:58:34 ID:???
正直、convertサブルーチンを使う気ならjcode.pl使えばいいじゃん。
Jcode.pmはオブジェクト指向が前提だし、その先にはEncodeへの視野がある。

使いこなせないなら無理すんな
160nobodyさん:2006/07/03(月) 01:25:18 ID:???
>159
jcode.plはUTF-8に対応して無いんだが
161nobodyさん:2006/07/03(月) 01:44:49 ID:???
>153
答えた本人じゃないけど・・・
>「必要不要は置いといて、オープンする度に毎回とりあえず統一処理する」
だと思う

俺も基本的にはデータファイルを読み込むときに改行を統一 (または不要なら削除) してる

「あれ? このデータは改行付だったっけか?」 なんて迷うことも少なくなるので、
自分でどの段階でまとめておくとか、自分なりのルールを決めておくといいかと思います。
162nobodyさん:2006/07/03(月) 02:25:22 ID:???
早く文字コードが統一される時代が来ないかな
もうこのさいUTF-8でもSJISでもなんでもいいからさ
163nobodyさん:2006/07/03(月) 07:23:23 ID:???
>>157
utf8の心霊はそんなにもeucっぽいという事?w
でも、実際には文字化けしてるわけで、・・・なんか変な感じだ・・・
164nobodyさん:2006/07/03(月) 07:27:52 ID:???
>>129
$_[0]=="ダメだ"
$_[1]=="ダメっす"
自分の経験からするとこういうランダムは、すぐにうっとうしくなるw
165nobodyさん:2006/07/03(月) 09:14:35 ID:???
>>162
unicodeはいい機会だったのだが日本語については従来のコード
との対応について統一に失敗したのでだめぽ。まったく当時その
辺で仕事してた奴らは負の遺産を残してくれたものだ。

166149:2006/07/03(月) 10:05:01 ID:???
>>161
もう誰もレスくれないと思ってたからちょっと感動。

やっぱり、オープンの度にコード統一する癖付けといた方が何かと良さそうですね。
これで改行統一の野望に一歩近づきました。
ありがとうございます!
167nobodyさん:2006/07/03(月) 12:27:50 ID:???
sjisで統一されたら面倒くさくて超困るしw
utf8は神。もうちょっとがんばってはほしかったが。

jcode の文字自動判別は前からいろいろ問題あったよね。
length で判定して同じ文字数だったらEUCにするので、
sjis で半角カナだけ書いて文字判別させると文字化けするとかね。
優先順位指定できたらもっと使いやすかったと思う。
168nobodyさん:2006/07/03(月) 12:30:55 ID:???
孫がトロン潰しさえしなければなぁ・・・
169nobodyさん:2006/07/03(月) 14:44:46 ID:???
>>167
>jcode の文字自動判別は前からいろいろ問題あったよね。
よくしらないので教えて欲しいんだけど、
utf8で文字化けしないencode方法あるの?
googleとかで文字化けしたの見たことないし方法あるのかなあ。
170nobodyさん:2006/07/03(月) 18:36:40 ID:???
>>169 > utf8で文字化けしないencode方法あるの?
ごめん、日本語でおk

(フラグのない) utf8 だって見分けるのは簡単でしょ。
最初の文字から最後の文字まで ascii と utf8 だけだったら utf8 てすればいい。
ああいう特徴的な文字の並びはほぼ間違いなく utf8 なんだから。

掲示板とかで sjis で HTML 書いてて、ほとんどそのフォームからデータ送信して受け取るのに、
euc と sjis が候補にあがった場合、わざわざ euc だと推測するのはおかしいでしょ?
その推測を頼りに決定しまってるのが jcode の convert というか getcode の欠点。
半角カナの文字化けだって、sjis 判定に半角カナのコード範囲を入れてないから起こるもの。

だから、何でもかんでも 1行で変換を済まそうとせず、
一旦 Encode::Guess の guess_encoding みたいに推測して文字コードの候補をとり、
複数の候補があった場合、プログラマがどっちを優先して変換するか書いて決めればいいんじゃないかと思うわけ。

長ぇ!
171nobodyさん:2006/07/03(月) 19:43:50 ID:???
つーか、普通にパラメータ増やして、文字コード
送信すれば?
<input type="hidden" name="encoding" value="sjis">
バイナリから推測なんてメンドクサイ、ムズカシイ、確実じゃない、いい事何もない。
172nobodyさん:2006/07/03(月) 19:47:02 ID:???
たしか質問者は、そのプログラムを他の人のページから使わせる気なんでしょ?
利用者が文字コード知ってて、しかもフォーム書き換えてくれるなんて
あまり期待できないと思うけど。
173nobodyさん:2006/07/03(月) 20:01:53 ID:???
検索とかで、ブラウザのアドレスから
http://〜/~.cgi?q=ほげほげ
ってやったときの文字コードなんて何になるかわかんないしな
174nobodyさん:2006/07/03(月) 20:41:54 ID:DxhEPLl+
「ファイルの中身の任意の1行だけを書き換える」という処理をする方法なんですが、
open(FH,$FILE);
while(<FH>){
if(マッチ条件){処理}
push(@newdata,$_);
}
とすると、マッチして書き換えた後もファイルの中身を最後まで読み込んで無駄な処理が出てしまいます。
lastとかで飛ばしたいところですが、そうするとファイルの中身が書き換えた行以降消えることになります。
こういうとき、どういう処理をすれば無駄なく完遂できるんでしょうか?
セオリーみたいなものがあれば教えて下さい。
175nobodyさん:2006/07/03(月) 20:50:54 ID:???
>>172
自分のページにフォーム作ろうなんて考える利用者はHTMLぐらいかけるでしょ普通
で、文字コード別にフォームのソース置いといて、化けない奴使ってね、て書けばたぶん分かる。
何にも知らない人はそもそも変なフォームから送信してこないので問題ないと思う・・・

>>173
フォームから入力したいって言ってるんだからGETメソッドに対応しなければいいのでは?
どうしてもGETも対応したいって場合も、ばけたら&en=***なんとかを付けて見て下さいみたいな
誘導でなんとかなりそう・・・
そもそも、アドレス欄からクエリー送信してくるのは上級者だと思う
176nobodyさん:2006/07/03(月) 20:51:54 ID:???
>>174
読み込みで開いてるので消えない
177nobodyさん:2006/07/03(月) 21:08:28 ID:???
ブラウザに送ってくる文字コードを指定する方法があって、すべてのブラウザが
それを守ってくれればいいのだが、とんでもないのが存在するのも現実だ。

一番ひどいと思ったのはhiddenとそれ以外で別のコードで送ってきやがった
某ブラウザ。数年前の話だから今は改善されてるかな。
178nobodyさん:2006/07/03(月) 21:11:39 ID:???
>>174
176の指摘はおいとくとしても、偶然同じ長さの行に書きかえるのでない限り
それ以後の内容を前後にずらす必要があるので、そういうことは考えるだけ
無駄ですな。

File::Inplaceの使用をお勧めする。
179nobodyさん:2006/07/03(月) 21:14:39 ID:???
>>174
一気に read でファイルの中身全部読み込んじゃって、
あとは s{^(マッチ条件).*}{ 処理 }em; とかして、
一気に書き出せばいいんじゃね?
180174:2006/07/03(月) 22:04:52 ID:DxhEPLl+
>>176
いや、確かにファイルの中身自体は消えてませんが、そういうことでは…。

>>178
多少の無駄には目をつぶって最後まで走らせておくのが吉なんですかね。
File::Inplaceについては調べてみます。ありがとうございました。

>>179
確かに正規表現で1回マッチ直後に処理すれば、無駄はなくなる…けど、
処理そのものの負担が大きくなってしまうような…。


色んな場面で必要にかられる処理だと思ったので、
他の人はどんな風に処理してるのか適当にCGIを見てみたところ
>>174に書いてあるのが結構多かったかも。
中には
open(FH,$FILE);
my @data = <FH>;
my $loop = @data;
my $i;
while($loop>0){
@temp = split(/ /,$data[$i]);
if(マッチ条件){
処理
last;
}
$i++;
$loop--;
}
ってのも、ありました。ちょっとゴテゴテしてるなぁ。
181nobodyさん:2006/07/03(月) 22:05:46 ID:???
KENTを見て育ってる者だ。
よくlocal何て使わないでmyと書いてあるがすべてmyにしたらダメだよね?
ちょっと違いが分からないので教えて欲しい・・・。
182nobodyさん:2006/07/03(月) 22:14:19 ID:???
>>180
> 処理そのものの負担が大きくなってしまうような

何でそう思うのかkwsk

my @data = <FH>;
↑こんなことしてる方がよっぽど負担強いてると思うぞw

>>181
コーチ変えたほうがいい。
183nobodyさん:2006/07/03(月) 22:19:42 ID:???
>>182
KENTが一番楽だったからそれにしてたいが今更コーチ変えろって
簡単で見やすいスクリプトなんてあるの?
何せKENTのスクリプトをみて覚えてきた人間だから今更となると見やすいスクリプトじゃないの無理な気がする。
184nobodyさん:2006/07/03(月) 22:20:53 ID:???
>>183
じゃあそのままでいろよ。
185nobodyさん:2006/07/03(月) 22:24:31 ID:???
っていうかKENTが神、ってネタか釣りなんだろ?そうなんだろ?
186nobodyさん:2006/07/03(月) 22:48:13 ID:???
KENTがperl5で全部書き直すか、プログラムの配布を止めれば
状況は変わると思う。
187nobodyさん:2006/07/03(月) 22:54:50 ID:???
>>174
任意の一行ってことはマッチする行がはじめから一行しかない
事が分かってるってことですかね?
それともマッチした最初の行だけとか、?(それだと174はまずいですよね・・・
ファイルの構造が固定してるなら、該当する行をダイレクトに指定
できる可能性とかはありえない・・・?
188nobodyさん:2006/07/03(月) 23:07:15 ID:???
KENTはKENT未満の読むに値しない汚いスクリプトから初心者を守ってるから神。
189nobodyさん:2006/07/03(月) 23:16:27 ID:???
つか、皆から見てKENTのソースってどうなん?
初心者のオイラにはなんのこっちゃか分からない行がたくさんあって、ちょっと嫌
190nobodyさん:2006/07/03(月) 23:20:54 ID:???
つい最近前スレだかでも話題になったからパス。
セキュリティくらい考えて作れよー。

まあKENT儲は ∩( ´∀`)∩コチラヘ (っ´∀`)っ))ドウゾ

KENT WEB 総合スレ Part2
http://pc8.2ch.net/test/read.cgi/php/1078991985/
191nobodyさん:2006/07/03(月) 23:32:34 ID:???
>>181
…向上心があるなら、出来るだけ早い内にPerl5流に馴染んでおいたほうが楽だぞ。本当に…
きっと、各種モジュールに興味が出てきた頃に、矯正するのに時間がかかって苦労する。というか、した。
# 独学だと何がまともなのか、判るようになるまでが難しい

閑話休題。多くの場合では、myに置き換えて大丈夫だと思う。
localとmyの違いは効果の範囲が動的…プログラムの流れに沿ったものか、
静的…ソース上のブロックに対応したスコープか、と言うのが一番の差。
以下、差を顕著にするためのどうしようもない汚い例。
sub fuga { $foo }
sub hoge_my { my $foo = 'hoge'; print 'my: ', fuga(), "\n" }
sub hoge_local { local $foo = 'hoge'; print 'local: ', fuga(), "\n" }
$foo = 'outer'; hoge_local(); hoge_my();
---------------
local: hoge
my: outer

あと型グロブのように、単純にmyに置き換えることの出来ないものもあるけれど、
これも、出来る限りリファレンスを使って書くのがPerl5流。
localの出番はPerlで定義済みの変数($/の類)とか。

何か大事な点がすっぽ抜けてたら、フォロー宜しくお願いします。
192nobodyさん:2006/07/03(月) 23:36:24 ID:???
local は変数宣言ではないので、use strictすると
local しただけではエラーになるので注意。my か our などが必要。
193nobodyさん:2006/07/03(月) 23:37:39 ID:???
>>191 は親切すぎるぜ…
194174:2006/07/03(月) 23:46:28 ID:DxhEPLl+
>>182
>何でそう思うのか
いや、単純に感覚的なものなので間違ってたらすみません。
ファイルの中身が数千行とかあった場合で、
該当する行の情報もそこそこ大きい場合、
全部読み込んで正規表現にかけるより
1行ずつチェックした方が良さそうに思っちゃいました。

>>187
>任意の一行ってことはマッチする行がはじめから一行しかない
>事が分かってるってことですかね?
その通りです。でも、その行はどこにあるのかは分からないし流動的。
掲示板とかアクセスログとかのログと同じようなもんですね。
なので、ダイレクトに指定することはできないです。
195nobodyさん:2006/07/04(火) 00:01:32 ID:???
>>194
数千行ならさあ、
数千回ループさせて、数千回ファイルからデータとってきて、数千回 @array にその大きいデータを push するのと、
改行の数なんか関係なく 1回 read して $scalar に入れて 1回だけ置換 するのと、
総合的にどっちが良さそうに見える?

まあその数千行のファイルが ウン十Mb とかなら話は変わるけど、そんな規模のデータファイル作ったりはしないよね。
とりあえずいくつか方法で迷ったらベンチでもとっとけばいいと思う。
196nobodyさん:2006/07/04(火) 07:41:17 ID:???
DB使ったほうが楽だと思うけどね。途中だけ書き換えるとか
かなり不毛。ファイルを編集するのが目的ならしょうがない
かもしれないが、データ保存用ならいくらでもやりようがある
はずだ。
197nobodyさん:2006/07/04(火) 10:28:25 ID:???
こういう話題だとDB使えって人はクライアントの仕事したことないんかね?
198nobodyさん:2006/07/04(火) 12:30:08 ID:???
ファイルが大きくなるなら、複数のファイルに分けて、インデックスも作っておく。
掲示板のログと一緒。
199nobodyさん:2006/07/04(火) 12:47:20 ID:???
$titleに入っている題名の間隔を空けて表示したいのです
置換でなかなかうまく行きませんでした
良い方法はありますか?
200nobodyさん:2006/07/04(火) 13:02:03 ID:???
エスパー頼む
201nobodyさん:2006/07/04(火) 13:11:56 ID:???
$title =~ s/([\x80-\xff].|[\x20-\x7e])/$1 /g;
202nobodyさん:2006/07/04(火) 13:27:20 ID:???
>>199
css使いなさいな
203nobodyさん:2006/07/04(火) 14:42:27 ID:???
>>201
ありがとうございます

CSSの本も2冊買っているのですがじっくり取り組む時間がなくて
これもやってみます
204nobodyさん:2006/07/04(火) 22:40:59 ID:???
>>174
もう、納得すみかも知らんが

#!/usr/bin/env perl -w
my @data = ();
my $flag = 0 ;
while ( <> ){
if( /print/ ){ s/print/say/ ; $flag ++ }
push @data, $_ ;
last if $flag != 0 ;
}
push @data, <> ;
print @data ;

これを hoge.pl として保存して
% perl hoge.pl hoge.pl
してみそ?
205nobodyさん:2006/07/04(火) 23:22:36 ID:???
foreach $loopsubject(@datname){
foreach(@localsubject){
if($_=~/$loopsubject/){
$localsubjectmatchswitch=1;
last;
}else{
$localsubjectmatchswitch=0;
}
}
}
のようなスクリプトを書いたのですがif($_=~/$loopsubject/)で判定してくれません。
判定後の処理にprint "match";を書いてみると何も帰ってきません。
@datnameの内容は
1152013113.dat
1152013147.dat
のようなものです。@localsubjectには2chのsubject.txtのような内容が入っています。
@loaclsubejctの中に@datnameの中身が入っているか判定したいのです。
入っていたらスイッチを1にしてループを終了させて、ループが全部終わったときに
スイッチが0だったら書き込みの処理をしたいです。

なぜ判定してくれないのでしょうか?教えてください。お願いします。
206nobodyさん:2006/07/04(火) 23:32:02 ID:???
2行目に
chomp $loopsubject ;
入れてみるとか…。
207205:2006/07/04(火) 23:57:29 ID:???
>>206
ありがとうございます!検出はうまくいきました!
でも今度はすでに@localsubjectにあるはずなのに無いと検出されます…なんででしょうか?いろいろ試してみたけどわかりません。
スイッチの検出は
if($localsubjectmatchswitch==0){
$writesubject=$datname[$i]."<>".$threadtitle[$i];
unshift(@localsubject,$writesubject);
}
のようにしてやってます。
208nobodyさん:2006/07/05(水) 00:06:26 ID:???
まさか last で外側の foreach ループまで一緒に抜けるとは思ってないよね・・・?
内側の foreach ループのあとに、フラグに関する処理が入ってるんだよね・・・?
209nobodyさん:2006/07/05(水) 00:07:58 ID:???
お前さん
>>205 では
$localsubjectmatchswitch=1;
ってマッチしたとき 1 代入してんのに
>>207
では 0 のときの処理を書いてるよ。
210nobodyさん:2006/07/05(水) 00:12:06 ID:???
>>205,207 が何やってるか全然わからないのは俺の頭が悪いだけかな?
211nobodyさん:2006/07/05(水) 00:16:10 ID:???
変数名が長い
212nobodyさん:2006/07/05(水) 00:29:19 ID:???
>>208,209
内側のforeachループでローカルsubject.txtの中身を調べて
マッチしたら1を返してすべてにマッチしてなかったら処理をするようにしています。0の時の処理を書いてるのはそのためです。
外側のforeachループは検索語を順番に処理するようにしてあります。
で、どうしたらいいんでしょうか?理論的には問題が無いように見えるのですが…
なぜマッチしたはずなのにマッチして無いとみなされるんでしょうか?
>>211
変数名長くしないとわからないアホな子なんです。許してやってください。
213205:2006/07/05(水) 00:31:21 ID:???
>>212>>205です。名前欄入れ忘れました。すいませんでした。
>>208
>内側の foreach ループのあとに、フラグに関する処理が入ってるんだよね・・・?
そのとおりです。
214nobodyさん:2006/07/05(水) 00:42:12 ID:???
まさかと思うけど
$localsubjectmatchswitch
の初期化はきちんと入れてるよね。>>205の2行目
(>>206のchompの次の行)あたりに。
215nobodyさん:2006/07/05(水) 00:46:40 ID:???
>>214のことは忘れて
216205:2006/07/05(水) 00:48:32 ID:???
>>214
入れてませんでした。でも入れても結果が変わらない…マッチして無いとみなされてsubject.txtに書き込まれる…
それと、なぜか一回で2重に(同じ内容が2行)書き込まれます。これもforeachあたりの間違いだと思うんだけどどこが悪いのかわからない…
アドバイスください。お願いします。
217nobodyさん:2006/07/05(水) 00:52:05 ID:???
つーか$iがどこから来るのかもわからん。
218nobodyさん:2006/07/05(水) 00:56:39 ID:???
ソースをうpしてくんないかな。
全容が見えなさすぎ
219nobodyさん:2006/07/05(水) 01:05:56 ID:???
配列の数少なくして一回一回内容 print してデバックすればわかるだろ?w
エスパー求めすぎ。
220205:2006/07/05(水) 01:23:12 ID:???
>>218
http://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi42709.txt.html
ソースうpしました。アドバイスお願いします。
>>217
$iは忘れてました。つけたら少しはまともな動作をするようになりましたが求めていたものとは違いました。
221nobodyさん:2006/07/05(水) 01:44:31 ID:???
my の変数の羅列で吹いたw
222205:2006/07/05(水) 01:50:05 ID:???
書き忘れてました。問題の部分は95行目から120行目までです
223nobodyさん:2006/07/05(水) 01:51:31 ID:???
>>205 のループってさ、
@localsubject のどれかが、
@datname の最後の値 ( @datname[ $#datname ] ) にマッチしたら 1、マッチしなかったら 0
ってことなんだけど、それは処理としていいの?
どうみても @datname の最後未満の値は、マッチしようがしまいが関係ないって感じだよね。
224205:2006/07/05(水) 02:27:35 ID:???
>>223
>@datname の最後の値 ( @datname[ $#datname ] ) にマッチしたら 1、マッチしなかったら 0
ってことなんだけど、それは処理としていいの?

@datnameは外側のforeachでまわしてるから全部にマッチしてるかどうか確かめてあるはずですけど…
判定ルーチンが内側のforeachのすぐ後ろに来るから判定はしてくれてるはずです。

いまいろいろやって、とりあえずローカルにsubject.txtを書き出すのはうまくいったみたいです。
あとは、これが2重に書き込まれないようにするためにしないとなんだけど、そこの処理をやってるのが96〜111行目なんですよね。
で、そこがうまくいってないみたいです。$localsubjectmatchswitch=0;になるときの処理に
print "nomatch";を加えたらすでにローカルsubject.txtに書き込んである場合でもnomatchを返されました。
だからif($loopsubject=~/$loopdat/)が問題ですかね?
それとも@datanameの内容が2つあるから違うほうの内容に反応してnomatchを返すことになってるのでしょうか?
でもforeach $loopsubject(@localsubject)で内容全部まわしてるから1つでもマッチしたら2重に書き込みはされないはずですけど…
なんでまずいのかわからないのでアドバイスお願いします。
225nobodyさん:2006/07/05(水) 02:39:35 ID:???
>>224
一回寝て朝もっかい考えなさい、このおバカw
226nobodyさん:2006/07/05(水) 02:42:02 ID:???
1152013147.dat<>エロゲ実況 黄金の蜂蜜酒で一線越え (290)
こんなの保存して楽しいのか
227nobodyさん:2006/07/05(水) 02:55:40 ID:???
どうせ print すんなら print "no match : '$loopdat'" とか書いてやれよ。
228205:2006/07/05(水) 02:59:19 ID:???
>>225
これが気になって眠れません。寝たほうがいいってか寝ないとなんですけど…
>>226
テスト用の検索ワードが思いつかなかったため適当に目に付いたスレを選んだのです。特に深い意味はありません。

原因が判明したっぽいです。103行目あたり、foreach $loopsubject(@localsubject){
でローカルのsubject.txtを解析するのですが、$loopsubjectをループ内でprintしてみたところ最後の1行しか表示されませんでした。
全部表示されるはずのローカルsubject.txtが表示されないということはマッチも出来ないわけですからnomatchになるということだと思います。
で、どうにかしたいんですがどうしたらいいんでしょうか?foreachで表示されないなんてことは初めてなのでわかりません。アドバイスお願いします。
229nobodyさん:2006/07/05(水) 03:04:35 ID:???
> open(F,">>$localsubjectpath")||die"subject.txtをopen出来ません:$!";
> @localsubject=<F>;

これかwwwwwwww
>> とか < とかの区別もできない子だったんですね。
230nobodyさん:2006/07/05(水) 03:07:22 ID:???
ただ単に「キーワードが全部含まれる」AND検索がしたいだけちゃうのかと
231205:2006/07/05(水) 03:22:39 ID:???
>>229
ファイルオープンの時につけるのって>と>>しか知らなかった…今ググってはじめて知った…orz
読み込みは出来るようになりました。迷惑かけて本当すみません。
でも、2重に書き込んじゃうのがどうしてもなくならないんですけどどうしたらいいんですか?
もう散々どこが悪いのか探したけどわからないんです。多分これが最後の質問です。お願いします。
232nobodyさん:2006/07/05(水) 03:33:40 ID:???
>>231
直したのはわかったけど、それでマッチするようになったのかマッチしないのかぐらい書いてよ。
どうでもいいけど、 chomp $loopdat; → $loopdat =~ s/[\r\n]+$//; とかのがいいかもね。
233nobodyさん:2006/07/05(水) 04:07:21 ID:???
つか、こんなん動かしてたら一瞬でアク禁だけど、その辺の覚悟はできてるんだよね?
234nobodyさん:2006/07/05(水) 04:27:05 ID:???
ttp://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi42719.txt.html
あ…ありのまま 今 起こった事を話すぜ!
『myの羅列とインデントにくらっと来たと
 思ったらいつの間にか作り直していた』
「今時Perl4」とかそんなチャチなもんじゃあ 断じてねえ
もっと恐ろしいものの片鱗を味わったぜ…

>>231
漏れのところでは開くモードを適切に変更して関連部分を修正すれば一応動くがなぁ…
+<モードで開いた?それとも<で読み込んだ後、一旦閉じて>モードで開きなおし?
もし+<モードなら、seekしてないんでないのか。

あと直接関係無いが、112行目の$iのインクリメント位置が間違ってる。

>>232
いや、そもそも@datnameには改行は入ってこない。
<>でsplitした前半相当だから。
235nobodyさん:2006/07/05(水) 04:35:40 ID:???
>>234
オメガワロスwwwww
ようやるわーw
>>205の意見を聞こうッ!!!
236nobodyさん:2006/07/05(水) 04:42:04 ID:???
>>234
あるあるwwwwwww 俺もイラッときて書き直してたw
237nobodyさん:2006/07/05(水) 05:00:47 ID:???
でもごくたまに、cgi 配布サイト? とかでも my 羅列してたりするよなw
一応 use strict 通るけど、あんなじゃ kent local と変わんないっつー。
238nobodyさん:2006/07/05(水) 07:41:25 ID:???
すっかりVIPのスクツになってしまったな
239nobodyさん:2006/07/05(水) 14:04:38 ID:???
my羅列ってC厨だろwしかも書けないくせにww
240nobodyさん:2006/07/05(水) 14:08:45 ID:???
my羅列って、とにかくmy使えるところには極力myを、ってこと?
それって良くないことなのか?
むしろ推奨!みたいな感じだと思ってたので詳しく教えてくれ。
241nobodyさん:2006/07/05(水) 14:28:40 ID:???
>>240
>>220 のソース見ればわかる。
242nobodyさん:2006/07/05(水) 14:35:34 ID:???
>>241
その羅列は想定外
243nobodyさん:2006/07/05(水) 14:39:12 ID:???
>>240-242の流れにワロタwww
244nobodyさん:2006/07/05(水) 15:12:35 ID:???
>>240-242
どひゃー。ぶったまげた。wwww
245nobodyさん:2006/07/05(水) 17:04:50 ID:???
ってか205出てこんかーいっ
246nobodyさん:2006/07/05(水) 17:13:00 ID:???
たぶん 205は >>234 のソースを3日くらいかけて解読してるとこw
247nobodyさん:2006/07/05(水) 18:10:57 ID:???
これはびっくり
248nobodyさん:2006/07/05(水) 18:24:10 ID:???
>>234の解析に3日かかったら、>>220の解析は33日かかりそうだw
249 ◆TWARamEjuA :2006/07/05(水) 18:47:17 ID:??? BE:1089252-#
(´-`).。oO(むりやりOopにした0chみたいな。。。)
250205:2006/07/05(水) 20:56:42 ID:???
   $i=0;
   foreach $loopdat(@datname){
   chomp $loopdat;
   $datmatchcheck{$loopdat}=0;
      foreach $loopsubject(@localsubject){
      if($loopsubject=~/$loopdat/){
      $localsubjectmatchswitch=1;
      print "match:$loopdat\n";
      last;
      }else{
      $localsubjectmatchswitch=0;
      print "nomatch:$loopdat\n";
      }
      }
   if($localsubjectmatchswitch==0 && $datmatchcheck{$loopsubject}==0){
   $datmatchcheck{$loopsubject}=1;
   $writesubject=$datname[$i]."<>".$threadtitle[$i];
   unshift(@localsubject,$writesubject);
   }
   
   $i++;
   }
このようにしてみました。しかし、2重に書き込まれてしまいます。
多分@localsubjectの中身を何度もまわすので、それでマッチして無いのがマッチして無いとみなされるみたいです。
2重に書き込まれないようにするにはどのようにチェックしたら良いでしょうか?アドバイスください。お願いします。
$datmatchcheck{$loopsubject}のようにしてみましたがこれではうまくいきませんでした。
251nobodyさん:2006/07/05(水) 21:10:50 ID:???
(´-`;).y-。oO (・・・さてどうしたもんやら・・・)
252nobodyさん:2006/07/05(水) 21:27:10 ID:??? BE:238787993-#
まず変数名をどうにかしろよw
253nobodyさん:2006/07/05(水) 21:32:17 ID:???
わざと
$localmyforeach;
$elsifwhile;
$unshiftopen;
みたいな変数名つけたらエラく読みづらくなるんだろうな…。
254nobodyさん:2006/07/05(水) 21:43:47 ID:???
foreach $tmpsub(@loaclsubejct){
  $found = 0;
  chomp;
  foreach $tmpdatname(@datname){
    chomp;
    if($tmpdatname =~ /$tmpsub/){
      $found = 1;
      $founddat = $tmpdatname;
      last;
    }
  }

  if($found){
    push(@founds, "$founddat<>$tmpsub\n");
  }
}
print @founds;

myとかは略した

255nobodyさん:2006/07/05(水) 21:45:05 ID:???
てかさ、チェックしようとしてる配列に書き戻すとかありえんだろ
256 ◆TWARamEjuA :2006/07/05(水) 21:46:41 ID:??? BE:871542-#
(´-`).。oO(subject.txtの再構築をしたいのかな?それだったらdatを全部舐めてタイトルを取得した方がよさそうな。。。)
257nobodyさん:2006/07/05(水) 21:48:29 ID:???
>>234
ttp://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi42797.txt.html
234のをさらにooっぽくしてみました・・・

当の205はまだ解決してないのかなw?
258nobodyさん:2006/07/05(水) 21:54:53 ID:???
いやしばらく見てなかったらすごいことになってますね。
久しぶりにくらくら来ました。
259nobodyさん:2006/07/05(水) 21:59:23 ID:???
テ、テポドン2...
260nobodyさん:2006/07/05(水) 22:15:12 ID:???
テポ丼2イイネェ
261nobodyさん:2006/07/05(水) 22:16:17 ID:DDQKgTGL
ファイルがあるかないかをif条件に入れて、ないなら作成したいです。
ファイル名はcontak.lolです。
cgi-binフォルダにあるかないかを調べたいです。

globを使うんですか?
なんか混乱しちゃって。
262nobodyさん:2006/07/05(水) 22:24:14 ID:??? BE:176880645-#
if(-f "./contak.lol"){ }
263nobodyさん:2006/07/05(水) 22:31:31 ID:???
レースコンディションで死にそうだなw
264nobodyさん:2006/07/05(水) 22:36:23 ID:???
-e じゃなくて?
265nobodyさん:2006/07/05(水) 23:19:27 ID:???
レースコンディション調べた。
へええ、そうか、ファイルロックと同じように攻撃されるわけかw

結局 perl では安全にファイルを作ったり読んだりするのはどう書けばいいのだろう?
File モジュール使えって? そりゃそうですが。
266nobodyさん:2006/07/05(水) 23:23:45 ID:???
sysopenでO_EXCL使えば?
267nobodyさん:2006/07/05(水) 23:59:55 ID:???
>>266
use Fcntl; しなくても動くならそうしたい (´・ω・`)
268nobodyさん:2006/07/06(木) 00:02:49 ID:???
O_EXCLなんて&O_EXCL()なんだから環境依存のマジックナンバー化してしまえば(ry
269nobodyさん:2006/07/06(木) 00:32:42 ID:???
>>268
そうか、君頭イイネ。
・・・
わかるか!ヽ( `Д´)ノ
270nobodyさん:2006/07/06(木) 00:44:34 ID:???
'>>'で開けばなければ作るよ。

ファイルを作ったのが自分かどうかはわからないが。
271nobodyさん:2006/07/06(木) 00:59:56 ID:FMcswvIH
perlどころかプログラム超初心者で困ってます。

バッチ処理(これはなんとか解決)を実行後に、元のHPでリンクされた
urlを新しいブラウザで開きたいのですが記述方法がわかりません。
どう記述すれば良いのでしょうか?

つまらない質問ですがよろしくお願い致します。m(__)m
272nobodyさん:2006/07/06(木) 01:26:41 ID:???
日本語の初心者は
273nobodyさん:2006/07/06(木) 01:30:44 ID:???
まず日本語を勉強してください^^
274nobodyさん:2006/07/06(木) 02:13:42 ID:???
perl初心者です。
perlって、サーバで動きますよね。
自分のパソコンで動かそうと思ったら、
apache,activeperlとかインストールしないとだめです。

ここで質問ですが、exeファイルみたいなので、
activeperl無しで動かすことってできるんでしょうか?

perlでアプリケーション作ったら、
apacheとactiveperlもいっしょに入れて、
自分でインストールしてください。
ということになるんでしょうか?

たとえば、チャットのクライアントソフトなど
作るときってどうなりますか。
よろしくお願いします。
275nobodyさん:2006/07/06(木) 02:26:05 ID:???
ここはコーティングスレですよー。

∩( ´∀`)∩ドウゾ (っ´∀`)っ))アチラヘ

CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
276nobodyさん:2006/07/06(木) 02:45:14 ID:???
それ以前に何も分かってなさそう・・・
277nobodyさん:2006/07/06(木) 03:58:15 ID:???
>>274
こんにちはこんにちは!
この辺を見るといいんじゃないかな…!
http://hamachiya.com/junk/memo_PAR.html
278nobodyさん:2006/07/06(木) 05:20:33 ID:???
>>277
うわ、これ便利スw
279nobodyさん:2006/07/06(木) 09:57:40 ID:??? BE:141503982-#
はまちやは書いてある事がいい加減だからこっちを見た方が良い
ttp://0xcc.net/diary/20040716.html
280nobodyさん:2006/07/06(木) 14:12:07 ID:???
274です。
すごい便利なものがあったんですね。
でも、説明読んでみるとソースコードが
簡単に見れるのと、複雑なコードが正常に
動かないとか書いてありますね。
もうちょっとネットや本の資料探してみます。
281nobodyさん:2006/07/06(木) 16:24:22 ID://0K++zo
すんごい初歩的なことでごめんなさい。
変数を区別する記号付けってどうやるのか度忘れしたので教えて下さい。
検索ワードのご教示だけでも良いです。

[例]
$i = 1;
print "hoge$i_code";
等を正しく表示したい。
282nobodyさん:2006/07/06(木) 16:26:45 ID:??? BE:298055693-#
${i}
283nobodyさん:2006/07/06(木) 16:26:57 ID:???
print "hoge$i","_code";
284nobodyさん:2006/07/06(木) 16:33:30 ID:???
print "hoge$i\_code";
285nobodyさん:2006/07/06(木) 16:54:28 ID:???
質問です。
OSはWINです。

すごい初心者で変な質問ですみません。
perlで、dosコマンドを実行することって
できるんでしょうか。

たとえば、
print "del a.txt";
というようにファイルを消そうと標準出力しても
実行できませんでした。

可能でしたら、方法ご教授お願いします。
286281:2006/07/06(木) 16:56:24 ID:gzQtm5v/
>>282
それです!ありがとうございます。

>>283>>284
print <<HTML;
hoge$i_code
HTML
だとどうなんですかね。
汎用性に問題あり?
教えてクレクレ君の分際で偉そうにすみません。
ありがとうございました。
287257:2006/07/06(木) 16:57:41 ID:???
>>258-260
なんとなく好意的な感想どもです〜^-^/
288nobodyさん:2006/07/06(木) 17:11:28 ID:???
>>285
実行するだけならsystem関数、その出力が欲しいならバッククォートまたは、パイプでopen。
だが、そのファイルを消すというのが単なる例じゃないとしたらunlink関数を使うべき

>>286
284はこういう場合に問題ありだな
"${i}nhoge"
289nobodyさん:2006/07/06(木) 17:24:25 ID:???
>>288
はやいお返事ありがとうございます。
さっそく勉強します。
290nobodyさん:2006/07/06(木) 17:40:34 ID:???
>>288
じゃあ "$i\x6ehoge"

とかいいつつ、俺もいつも ${i} 以外は書かないw
291nobodyさん:2006/07/07(金) 08:16:27 ID:???
>>290
いつもって、そんなに使うことありますか。それ使うときって
変数を変数名にする場合ってことであってますか?
292nobodyさん:2006/07/07(金) 08:22:27 ID:???
>>291
大人にはいろいろあるのよ。
293nobodyさん:2006/07/07(金) 08:25:50 ID:???
>>292
ム板のアリスさんでしょ?僕を大人にしてください。おながいします。
294nobodyさん:2006/07/07(金) 12:05:06 ID:???
すいません。本当に初歩的な質問かと思いますが、
Perl5.8で、jcode.plやJcode.pmを使わずに
全角英数と半角英数の変換を行う方法があれば、教えてください。
295nobodyさん:2006/07/07(金) 12:32:03 ID:???
ttp://www.kanzaki.com/docs/jcode.html
step1. 文字コードについて理解する
step2. がんばる
296294:2006/07/07(金) 14:25:27 ID:???
色々Web検索しながら試してみたところ、
下記のようなスクリプトをUTF-8で保存し、
入力テキストファイルもUTF-8で記述したところ、うまく動作しました。
$_ = decode('utf8',$_);
の部分の意味がよくわからないので教えてください。
ここは何をしてるんでしょうか?

use strict;
use utf8;
use Encode qw/ encode decode /;

while (<>){
$_ = decode('utf8',$_);
tr/[0-9]/[0-9]/;
print;
}
297nobodyさん:2006/07/07(金) 15:11:08 ID:???
tr/[0-9]/[0-9]/

オアエスゴイナww
298nobodyさん:2006/07/07(金) 15:19:10 ID:gJw2prbr
配列の中身全部を全角→半角みたいに変換するには
やっぱforeachとかで中身を展開しながら1コずつ処理するしかない?
jcode.plとかJcode.pmとで配列そのものを扱う方法ってある?

>>294
英数字限定なら正規表現でどぞ。
299nobodyさん:2006/07/07(金) 15:40:01 ID:???
それくらい面倒くさがるなよ(´・ω・`)
300298:2006/07/07(金) 16:19:58 ID:???
>>299
CGI.pmでフォームの内容を配列に入れて文字コードごにょごにょってのは
結構色んなとこで使われそうな処理なんで、実装されてたりするのかなぁ、と思ったもんで。
無いと分かれば、安心して配列回しまくれますわ。さんくす。
301294:2006/07/07(金) 16:27:23 ID:???
>>297
[]は要らないよ、とおっしゃっているのでしょうか?

>>298
正規表現というと、具体的には?s///を使ってできるという意味ですか?
302nobodyさん:2006/07/07(金) 17:13:35 ID:???
>>296
1byte 単位(正確には 8bite 単位)の処理から utf8 の文字列処理に
変換している。
$_ = decode('euc-jp', $_ ) ;
なら、8bite 単位の羅列を euc-jp でエンコードされてると見做
した上で、utf8 に変換。
303294:2006/07/07(金) 17:26:00 ID:???
>>302
レスありがとうございます。
バイト単位から文字単位へ、という事が必要なので
読み込ませるテキストがUTF8でも必要、という事でしょうか。

読み込ませるテキストの文字コードがわかってない時はややこしそうですね。
304nobodyさん:2006/07/07(金) 17:40:55 ID:???
>>303
その通りだと思います。が、perl hacker ではないのでw
305205:2006/07/07(金) 20:47:14 ID:???
自己解決しました。2重に書き込みされてたのは書き込み部分
open(F,">$localsubjectpath")||die"subject.txtをopen出来ません:$!";
foreach(@localsubject){print F $_;}
close(F);
が追記モードになっていたために2重に書き込んでしまうという症状が起きました。
上書きモードで実行したらうまくいきました。
くだらない質問に答えてくれて本当にありがとうございました。
306nobodyさん:2006/07/07(金) 21:37:02 ID:???
>>305
解決おめ。
234で指摘したのとほぼ同じ原因でないか…自力で二日も模索乙
まさか、まだ追記モードを使っていたとは夢にも思ってなかった訳だが。
307nobodyさん:2006/07/07(金) 22:07:16 ID:???
>>305
おめ。
俺はがんばって >>234 のコードを読解して新しく書き直してるのかと思ってたw
少しは参考にすればいいのにね。
308294:2006/07/08(土) 10:38:42 ID:???
すいません。こちらではこれ以上回答がいただけないようなので、
こちらでの質問はこれで終わりとし、
別スレでこちらで回答していただいた事を元に
少しポイントをしぼって質問してみたいと思います。
回答していただいた方々、ありがとうございました。
309294:2006/07/08(土) 10:40:49 ID:???
あ、ひょっとしたら他所で質問しないかもしれないです。では。
310nobodyさん:2006/07/08(土) 13:48:22 ID:???
他所で質問しても無駄だと思うけどwwwww
311nobodyさん:2006/07/08(土) 14:50:57 ID:9n4HcMAb
Encodeを使ってメール送信用にUTF8からJISに変換したいのですが、
「〜」の変換がうまくいきません。
変換できずに、「\x{ff5e}」になってしまいます。
JISにも「〜」ありますよね。

どうしたら回避できるでしょうか?
312nobodyさん:2006/07/08(土) 14:58:49 ID:???
文字コードも書いてないしなー。
どの文字コでも設定と正規表現で2行だと思うけどw
313nobodyさん:2006/07/08(土) 15:03:12 ID:???
>>311
それうちもなった気がする。
「〜」 だけ自分で直せばいいんじゃないかな
314nobodyさん:2006/07/08(土) 15:15:04 ID:???
>>311
Unicodeと既存のエンコーディングのマッピングを作る際に、〜のマッピングがメーカーによって
WAVE DASHとFULLWIDTH TILDEの二つに分かれてしまったことに起因する問題。
http://ja.wikipedia.org/wiki/Unicode

事前に"\xEF\xBD\x9E"(\x{FF5E})を"\xE3\x80\x9C"(\x{301C})に変換して統一してやればOK。
ちなみにUTF-8はASCIIとの兼ね合いは勿論のこと、1バイト目の範囲が2バイト目以降の範囲と
重ならないように設計されているから、utf-8フラグを使用しない場合でも、ずれてマッチする心配はしなくて大丈夫。
315nobodyさん:2006/07/08(土) 15:17:56 ID:???
>>314
うわぁ、知らなかったナリィ・・・
316nobodyさん:2006/07/08(土) 15:28:25 ID:???
>>311
とってもまだるっこしいですが、

encode('iso-2022-jp', decode('shiftjis', encode('cp932', $x)))

とする手もあります。

日本は既存の文字コードとunicodeの対応表をつくるにあたって
統一に失敗して大きく2種類(JISとMS)できてしまったため、こんな
面倒を強いられるのです。恨むなら当時の関係者を恨んでください。

ちなみに「〜」を\x{ff5e}にするのはMS流で、JISだと\x{301c}に対応
させることになっています。

個人的には日本語に関してはunicodeはunicode-jisをunicode-msの
2種類あると思って、それらを自動判定して相互変換するJcode相当の
モジュールが欲しいなと思います。
317nobodyさん:2006/07/08(土) 15:31:47 ID:???
みんなEncode使ってるみたいだけど、
そういう面倒を吸収してくれるライブラリがやっぱり必要なんじゃない?
318nobodyさん:2006/07/08(土) 15:39:20 ID:???
変換 → 自作モジュ → Encode (5.8の場合)
                  → Jcode (それ以下)

とかやって、その自作モジュのとこで対策すればいいのかもだね
319nobodyさん:2006/07/08(土) 15:40:35 ID:???
>>314 リンク先のリンク先 の dan さんのとこで
ttp://search.cpan.org/dist/Encode-EUCJPMS/EUCJPMS.pm
使え的な指摘がありますよ。
320nobodyさん:2006/07/08(土) 15:41:10 ID:???
「の」がぬけた orz...
321311:2006/07/08(土) 15:41:57 ID:9n4HcMAb
みなさんありがとうございます。
〜は事前に\x{301c}に変換したいと思います。

実際、携帯電話からの入力なので、
Encode::from_to( $x, "CP932","UTF8");
としてUTF8に変換してたのですが、CP932→UTF8なので「〜」が\x{ff5e}になってしまうんでしょうか?
322nobodyさん:2006/07/08(土) 15:55:45 ID:???
その方向だと、円マーク(\)やオーバーライン(~)は大丈夫なん?
323nobodyさん:2006/07/08(土) 16:11:50 ID:???
スカラ変数は白い布で覆った方がいいのでしょうか?
324nobodyさん:2006/07/08(土) 17:22:37 ID:H4L43ePp
push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..3;

これを省略せずに書くとどうなりますか?

配列の1番目から4番目まで限定的ではなく
配列内全てをforeachする書き方が分かりません。
@hoge_Aと@hoge_Bの要素数は同じです。
325nobodyさん:2006/07/08(土) 17:40:04 ID:???
>>324
> push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..3;
> これを省略せずに書くとどうなりますか?
foreach my $i (0,1,2,3) {
  push @fuga, $hoge_A[$i] . $hoge_B[$i];
}
326nobodyさん:2006/07/08(土) 17:41:41 ID:???
>>324
省略せず、じゃなくて一般化の話かな。
まず要素数を取得し、そこから範囲を作る。そのRangeに対してforeachもしくはmap
push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..@hoge_A-1;
or
@fuga = map { "$hoge_A[$_]$hoge_B[$_]" } map 0..@hoge_A-1;

しかし、要素数は同じと言い切れるんだったら、同時に管理されるデータなんだろ?
なら関連性のある二つのデータを別の配列に入れると言う、その構造を何とかしたほうが良いと思う。
@fuga = map { "$_->{A}$_->{B}" } @hoge;
そうすると、こんな風にできる。詳しくはperllolを参照
327nobodyさん:2006/07/08(土) 17:44:23 ID:???
>>326
@hoge_A-1 を $#hoge_A
と書くのがBest Practice。
$#は配列の最後の要素番号を表すから、
配列のインデックスとして使う場合に適している。
328326:2006/07/08(土) 17:47:57 ID:???
>>327
あースマソ…存在をすっかり失念していた…
あとでここ数ヶ月のスクリプトを確認せにゃ
329326:2006/07/08(土) 18:01:09 ID:H4L43ePp
>>325
「配列の1番目から4番目まで回す」んじゃなくて
「(0,1,2,3)という配列を回す」ってことだったんですね。
ありがとうございます。

>>326
大変詳しい回答と説明ありがとうございます。
想定通りの結果を得ることができました。
>関連性のある二つのデータを別の配列に入れると言う、その構造を何とかしたほうが良いと思う。
まさにその通りで、そのために今回の処理をしようとしていました。
具体的には(情報の後出しになってしまいますが...)
フォームから「月」と「日」を取得し、「日付」という配列に格納するための処理です。
とにもかくにも、アドバイスまでいただいて本当にありがとうございました。

>>327
より良いコードのためのアドバイスありがとうございます。
勉強になりました。
330nobodyさん:2006/07/08(土) 18:04:13 ID:???
珍しく気持ちのいい質問者だw
331nobodyさん:2006/07/08(土) 18:51:46 ID:???
perl 5.005 で print "\x{ff5e}"; とかってエラーするんだっけ? 単に文字化けするんだっけ?
環境なくなっちゃって確認できなくて orz
332nobodyさん:2006/07/08(土) 19:08:45 ID:???
エラーにはならない
333nobodyさん:2006/07/08(土) 19:13:39 ID:???
>>332
ならおk! ありんこー。
334nobodyさん:2006/07/08(土) 20:17:42 ID:???
$cnt = @hoge_A ;
1 while $cnt != push @fuga, ( shift @hoge_A ) . ( shift @hoge_B ) ;
つーのを思いついた自分に鬱
335nobodyさん:2006/07/08(土) 21:09:20 ID:???
すいません、クエリについて質問があるのですか・・・。

ある掲示板スクリプト(bbs.cgi)があるとします。
自分のWEBサイトではこの掲示板をいくつか設置しているのですが、
そのたびに、「bbs1.cgi」、「bbs2.cgi」、「bbs3.cgi」みたく名前を付けて設置しています。

これをクエリを使用して「bbs.cgi?c=1」や「bbs.cgi?c=2」みたくしたいのですが、考え方が分かりません。
ちなみにできればWEB上から必要な数を必要なだけ作成できるようにしたいと思っています。


アルゴリズムだけで構いませんので、どうかよろしくお願い致します。
336nobodyさん:2006/07/08(土) 21:17:18 ID:???
エスパーさん、おながいしまつ
337nobodyさん:2006/07/08(土) 21:59:16 ID:???
これは普通に読めるけど?

>>335
そのスクリプトの構造にもよるけど十中八九大改修。
他の掲示板と共有できない点を洗い出すことから始めるといいよ。ログファイルとか。
ファイル名変えてる=同一ディレクトリって所から危なっかしいけどPerl関係ない…
改造スレあたり行くのが無難だと思う。
338nobodyさん:2006/07/08(土) 22:33:57 ID:???
CGI上で
print $x;
としようと思うのですが、$xはリファレンスの可能性があります。
リファレンスの場合であってもref関数でチェックなどせずにそのまま表示しようと思うのですが、リファレンスだとメモリの場所がわかるわけですよね。
これが何かセキュリティ上問題になるようなことはあるのでしょうか。
例えば、他の変数の内容を閲覧できてしまう、といったことがあれば考え直そうと思うのですが。
339nobodyさん:2006/07/08(土) 22:38:32 ID:???
この程度のこともどうやるか見当もつかないプログラミングスキルでは
無理なのでもうすこし地道に勉強してからの方がいいと思われる。
340nobodyさん:2006/07/08(土) 22:39:14 ID:???
あ、すまん。339は335へのレスね。
341nobodyさん:2006/07/08(土) 22:42:45 ID:???
>>338
そんなことで悩んでる暇があったら表示されないようにちゃっちゃと
書き直すほうが早い。

メモリの場所がわかっただけで即やられるということはないだろうが、
他のセキュリティホールとの合わせ技でなんかされる可能性を
否定するのは難しい。

342nobodyさん:2006/07/09(日) 05:26:05 ID:???
>>338
> これが何かセキュリティ上問題になるようなことはあるのでしょうか。

直接の問題はないと思う。
が、何を「セキュリティ上問題」とするかによるだろうね。
「メモリの場所がわかる」ことも見方によれば問題だろうし。
343nobodyさん:2006/07/09(日) 05:32:57 ID:???
>>335
ログ読み込みで
open fh,"log$ENV{QUERY_STRING}.dat";
ログ書き込みで
open fh,">log$ENV{QUERY_STRING}.dat";

・・・不特定多数が来る板だとキケンかもw
344nobodyさん:2006/07/09(日) 05:40:13 ID:???
>>338
$xはリファレンスでなかったら何になる可能性があるの?
リファレンスになるかもしれない$xを表示したいwebコンテンツ
って言うのが謎なんだけど・・・w
345338:2006/07/09(日) 07:29:33 ID:???
>>341-342
ありがとうございます。

>>344
確かにそうですね、、よく考えるとそう思います。
ちょっとアルゴリズムを再考してみます、ありがとうございました。
346nobodyさん:2006/07/09(日) 13:14:05 ID:OFKeC9Kg
配列の要素に「その時点で何度目の重複か」という数字を付けたいんですが
そういうことはできますか?
簡単な例で言うと、
@DATA = ('B','A','A','B','A','D','C','D');
という配列を対象とした場合は、
@DATA = ('B0','A0','A1','B1','A2','D0','C0','D1');
といった感じです。

map{$count{$_}++}@DATA;
という風にしていくつ重複があったかを調べることはできたんですが
その都度、数字を振る方法が分かりません。
分かる方、どうぞよろしくお願いします。
347nobodyさん:2006/07/09(日) 13:21:34 ID:???
grep { $_ = sprintf("$_%d", $count{$_}++) } @DATA;
348nobodyさん:2006/07/09(日) 13:24:03 ID:???
@data = map { $_ . $count{$_} ++ } @data ;
>>347
何故に grep ?
349nobodyさん:2006/07/09(日) 13:36:33 ID:???
346です。

>>347さん
>>348さん
即回答ありがとうございます!
どちらの方法でもうまくいきました。
348さんの記述の方がより簡潔なのでそちらの方を使わせてもらおうと思いますが
347さんの記述も参考にして勉強します(恥ずかしながら記述の内容が理解できてないので)。
ありがとうございました!
350nobodyさん:2006/07/09(日) 15:12:46 ID:???
>>348
それだと 0 が付かないと思ったら、ちゃんと付くんだね。
++ で空の値が 0になる方が. の連結より評価が先になるってことか。

grep 使うのは @data に書き戻さないで良いから(@dataを直接書きかえる)。
>>348 のを grep で書くと
grep { $_ = $_ . $count{$_}++ } @data;
351nobodyさん:2006/07/09(日) 15:29:54 ID:???
>>350
>grep 使うのは @data に書き戻さないで良いから(@dataを直接書きかえる)。
いや、map でも無精しなければ…。s/grep/map/ してみ?
352nobodyさん:2006/07/09(日) 15:42:53 ID:???
$_ = $_ . $count{$_}++ for @data;

でよくね?

# TMTOWTDI
353351:2006/07/09(日) 15:45:39 ID:???
>>352
># TMTOWTDI
そだね。
354nobodyさん:2006/07/09(日) 16:19:00 ID:???
こういうのを見てしまうとPerlに戻りたくなるなぁ
制御構文の後置って書いていて気持ちいいんだよな
355nobodyさん:2006/07/09(日) 16:29:17 ID:Grc/Miyg
質問です。

以下のようなハッシュと配列があります。

my %sex = (
'm' => '男性',
'f' => '女性',
);

my @list = ('name','age','sex','mail','addr', ・・・);


プログラム中で、
while (my($key,$val) = each(%sex)){
 ・・・
}

という処理を行いたいのですが、%sexの'sex'という文字列を、@listから拾いたいのです。

while (my($key,$val) = each(%{$list[2]})){
 ・・・
}

というふうに。
もちろん上記の例では「ハッシュではありません・・・」という意味のエラーが出るのですが、
やりかたがわからず困っています。

each(eval ('%' . "$list[2]")

でもやっぱりダメで、他に考え付きません・・・
よろしくお願い致します。
356nobodyさん:2006/07/09(日) 16:39:01 ID:???
my @list = (\%name,\%age,\%sex, ・・・); これじゃあかんのかいな?

ってか普通は %sex とかを $hash->{sex} = {}; とかってやる気がする。

ちなみに eval でやるなら
each(eval ('%' . "$list[2]") → each(eval ("\\%$list[2]") こうじゃね。
357nobodyさん:2006/07/09(日) 16:46:51 ID:???
\ 多いて orz
358nobodyさん:2006/07/09(日) 16:46:54 ID:???
eval "each %$list[2]"
359355:2006/07/09(日) 19:33:47 ID:???
>>356
配列@listには、"配列やハッシュに使う「名前」"だけを格納してるのです。。

>>358
evalの使い方を間違えていたのですね。
ありがとう。その例でできました。
360nobodyさん:2006/07/09(日) 20:03:39 ID:???
>>359
>配列@listには、"配列やハッシュに使う「名前」"だけを格納してるのです。。
どういう経緯でそうなったかは知らないけど、
eval使いまくりで効率悪くなる事この上ないなぁ。

my %var = (
 'sex' => {
  'm' => '男性',
  'f' => '女性',
 },
 ...
);

みたいにして
each %{$var{$list[2]}}
とすると、eval使わなくていいけど。
361nobodyさん:2006/07/09(日) 20:04:15 ID:???
どうしてこう変数名を使ってなにかをしたがる奴が多いのだろうか。
デバッガ作るんでもなけりゃ名前をキーにしたハッシュにしとけよ。
362nobodyさん:2006/07/09(日) 20:39:33 ID:???
てぃむどぅでぃはいいけど、せめて use strict 通るのにしたいね。
363nobodyさん:2006/07/10(月) 09:14:03 ID:???
perlでサービスというか常駐プログラムを作りたいんだが
メモリの取得とか開放とか 変数使ったときの内部の挙動が
いまいち心配なのですがどうしたらよいでしょうか
364nobodyさん:2006/07/10(月) 09:41:10 ID:???
>>363
perlのGCはリファレンスカウントなので循環参照を作って使い
捨てるとメモリリークになる。これに注意すれば無限に太り続ける
ことはないだろう。

perlは基本的にosからとったメモリは返さないので、一度でも大量に
メモリを使うと太ったままになる。それが困るようならたまにexecする
ぐらいしか手はない。

例外もあるがくわしくはperlfaq3の

How can I free an array or hash so my program shrinks?

参照。
365nobodyさん:2006/07/10(月) 16:54:29 ID:kBFNwS+A
2つの配列に同じ要素を代入したいんですが
pushで複数の配列に同時に要素を代入する方法ってありますか?
366nobodyさん:2006/07/10(月) 17:07:07 ID:???
>>365
pushにそんな機能は無い
367nobodyさん:2006/07/10(月) 17:18:03 ID:kBFNwS+A
>>366
ありがとうござました。
おとなしく、2つ目の配列に1つ目の配列を代入します。
368nobodyさん:2006/07/10(月) 17:46:11 ID:???
それより同じ配列を二つ用意しない方法を考えた方がいい気がするけど
369nobodyさん:2006/07/10(月) 18:08:23 ID:kBFNwS+A
>>368
数字を、片方はそのまま(データ処理用)、
もう片方はコンマ付き(ブラウザ表示用)、
と分けようとしたとき、その過程でどこかに
同じ配列を用意しないといけないと思っていました。
そうしなくても良い方法ってありますか?
370nobodyさん:2006/07/10(月) 18:14:45 ID:???
「同じ要素」 って言ってなかったっけw
371nobodyさん:2006/07/10(月) 18:16:43 ID:???
ブラウザ表示する時にはじめてカンマつけて出力すれば?
どうせカンマ付きはそこで使い捨てになるんだろうし。
同じ配列2つだと整合性の問題もある。
372nobodyさん:2006/07/10(月) 18:24:39 ID:kBFNwS+A
    @       A        B       C
数字のデータ → 配列A → 素のデータ  →   処理
         → 配列B → コンマ付きデータ → ブラウザ出力

という流れを想定しての質問でした。

>>370
確かに結果的には別の要素になりますが、その過程(Aの時点)では
同じ要素を入れる必要があると考えていたので、その局所的な点から
「同じ要素」と言ってしまいました。誤解を与えたならすみません。

>>371
ブラウザに表示するのは1度ではないので、その都度コンマを付けるより
初めから別に配列のデータを作って代入した方が良いかと思っていました。
整合性の問題については具体的には良く分かりません。
373nobodyさん:2006/07/10(月) 18:27:23 ID:???
>>372
(3) の時点で配列のコピーつくればいいんじゃ?
var Array2 = Array1.concat(); とかして
374nobodyさん:2006/07/10(月) 18:33:57 ID:???
>>372
>整合性の問題については具体的には良く分かりません。
途中で素のデータの方に変更がかかると
コンマ付きの方と値がズレるかも、ということ。
素のデータを更新したら、その都度、コンマ付きの方も更新しないといけない。
そういう心配をするなら、一つにしといた方が間違いが無い。
375nobodyさん:2006/07/10(月) 18:50:46 ID:kBFNwS+A
>>373
(2)の段階で配列を2つ作ることと
(3)の段階で配列のコピーを作ることとの違いが分かりません。

>var Array2 = Array1.concat();
こういうのは見たことがないんですが、
配列のコピーというのはそういったテンポラリファイルとしてコピーする
モジュールか何かがあって、それを使うということでしょうか?

>>374
ご説明ありがとうございます。
配列に代入した後にデータを変更することはないので
その点については大丈夫です。
ただ、そういう考え方は重要ですね。
376363:2006/07/10(月) 18:52:56 ID:???
>>364
ありがとうございまんこ
変数はローカル変数でも消費しちゃうのかな
とりあえず、perlでデーモンはいったんあきらめてみます
377nobodyさん:2006/07/10(月) 19:12:46 ID:???
>>375
> 配列に代入した後にデータを変更することはないので
今の処理ではそうでも、何か拡張したときに変更するかも知れない。
データは1つだけ持っておき、出力時に変換関数を通すほうが安全。

同一データを変換する処理が数百回にも及ぶため、変換後のデータをキャッシュしておきたい、
というような要求に見えるが、安全性からはオブジェクトにして、データへの変更時には、
キャッシュも必ず更新されるようコーディングすべき。
378nobodyさん:2006/07/10(月) 19:41:21 ID:kBFNwS+A
>>377
アドバイスありがとうございます。

例えば、ブラウザに直接表示される部分はコンマ付きの値を
同時にフォームのhiddenでコンマ無しの素の値を、それぞれ置いておく
と言った場合には、局所的にせよ、やはり同じ配列を用意して
片方だけをコンマ付きにする必要があると思うんですが、
どうでしょうか?
379nobodyさん:2006/07/10(月) 19:46:27 ID:???
もうどっちでもいいよ、君の好きなようにすればいい。
380nobodyさん:2006/07/10(月) 19:51:23 ID:???
なんで一時的にしか使わないコンマ付きの値を、
配列全体に渡って作ろうとしているのか、そこが不明。

どうせ表示して終わりなんでしょ?
だったら、テンプレートにフィルタかけて、
表示側だけコンマ付きにすることもできるのに。

まぁ重複管理したければどうぞ。
381nobodyさん:2006/07/10(月) 20:01:11 ID:???
初心者スレとは思えない厳しさだな。おまえらw
382nobodyさん:2006/07/10(月) 20:11:58 ID:kBFNwS+A
>>379
はぁ・・・そうですか。
気分を害されたようでしたらすみません。
別段口答えしようというわけではなく、
指摘されたようなデータの保持の仕方は
理想的で、常にそうあるよう心掛けるべきだとは思いましたが、
どんな場面でも適用できるのか疑問に思ったので
しつこく質問してしまいました。
すみませんでした。

>>380
>なんで一時的にしか使わないコンマ付きの値を、
>配列全体に渡って作ろうとしているのか、そこが不明。
例えば、「数字をフォームに入力し、その数字について確認する
確認時には見やすいようにコンマ付けされた数字をブラウザには表示する
しかし、それとは別にhiddenで素の数字を置いておく」
といった場合のやり方をするためには、同じ配列を用意して
片方の配列のみコンマ付け仕様にする、という方法しか思いつかなくて
そうしていました。
ちなみに、配列内全てが入力された数字の情報なので、配列全体に渡って
コンマ付きの値を作る必要があるという流れになりました。

>だったら、テンプレートにフィルタかけて、
>表示側だけコンマ付きにすることもできるのに。
この方法については知りませんでした。
具体的にどういうことかはよく理解できませんが、
これ以上の質問はスレ汚しになりそうですし
お怒りを買いそうなので、これにて失礼します。

レス下さった方々ありがとうございました。
気を悪くされた方々、悪意はありませんでした。すみませんでした。
383nobodyさん:2006/07/10(月) 20:24:53 ID:???
>>382
379だけど、
別に気分害したわけでもなく、単にどっちでもいいと思っただけw
好きなように書かないと楽しくもないし、そっちのがお手軽なら、そうすればいいんじゃね? みたいな。
せっかく perl なんだから、1つの方法にこだわることないし。
>>380 とかだって、よりいいやり方もあるよ、って示しただけだしね。
384nobodyさん:2006/07/11(火) 00:36:18 ID:???
要は保存用の配列と表示用の配列ってことでしょ?

メモリ上の配列を弄ってもデータファイルには影響ないのだから、データ保存完了後に
好き勝手弄ればいい
385nobodyさん:2006/07/11(火) 10:15:27 ID:???
mod_perlか何かで、カンマ付きの値もずっと持ち回るなら、
あるいはパフォーマンス上、別データとして保存する利点もある。

しかし、同一の値を1回だけ出力するという今回の質問では不要。
元データだけ持っておき、出力時に変換すれば十分。
というか、メモリの無駄使い。
386nobodyさん:2006/07/11(火) 10:33:29 ID:???
配列や変数を見直すより、出力部分を考えたほうがいい。
大抵はテンプレートファイルを読み込んで
決めておいたタグ部分を変数に置換するものだと思う。
その時に「カンマをつけるタグ」を別途用意しておいて
カンマつける関数かまして置換すればいいと思う。
自力で考え出した時俺は天才かと思ったwwwナツカシス
387nobodyさん:2006/07/11(火) 12:28:46 ID:???
Template Toolkit用のプラグインで

Template::Plugin::Comma - TT Plugin to commify numbers

ってのがまさしくそういうの。CGIじゃTTは重いかもしれんけどね。
388nobodyさん:2006/07/11(火) 12:34:16 ID:???
TT使ったことがあれば出力時に処理すればいいだけだとわかる
モジュール使わずに自分で書いてるとなかなか思いつかないかもね
俺も最初は変数コピーしてカンマつけてその変数を出力してた
>>386みたいにすればテンプレートをいじるだけでOKだから管理が楽
389nobodyさん:2006/07/11(火) 15:26:39 ID:???
var Array2 = Array1.concat();
で、なんでだれもココ突っ込まないんら?
390nobodyさん:2006/07/11(火) 15:33:00 ID:???
>>389
シッ! 見ちゃいけません!
391nobodyさん:2006/07/11(火) 15:38:05 ID:???
>>389恐ろしい子っ!!!
392nobodyさん:2006/07/11(火) 19:27:03 ID:D6pM+gvD
流れぶったぎってスマソ

6桁の数字の連続060711とあったら
$yaer = 06;
$mon = 07;
$day = 11;
というように分けるにはどうすれば良いんでしょ?
06.07.11みたいに区切り入れてsplitするしかない?
393nobodyさん:2006/07/11(火) 19:28:51 ID:P82+nFT5
my $temp = qq|Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)|;
print @{[split /;/,$temp]}->[1];

これってどういう理屈でしょうか。
splitがリストを返してきてそれを一旦無名リファレンスにしてますよね?
で、あとはそれをデリファレンスだけですが。

う〜ん・・・無名のデリファレンスってこんなのだっけなぁ
394393:2006/07/11(火) 19:30:40 ID:P82+nFT5
print [split /;/,$temp]->[1];

やっぱり普通はこうですよね。
で、両方できるみたいだけど。。。
初めのやつはどんな理屈なんでしょうか。
395393:2006/07/11(火) 19:32:35 ID:P82+nFT5
もしかして初めのやつは

[split /;/,$temp] これで無名配列リファで
{[split /;/,$temp]} これでさらに無名ハッシュリファにしてますか??

それでハッシュの中に入ってる配列のリファのデリファをするのに
print @{[split /;/,$temp]}->[0];
ってなるのかなぁ。
でもなんで初めに%じゃなくて@になるんでしょう
396nobodyさん:2006/07/11(火) 19:38:55 ID:???
>>392
my($year, $mon, $day) = unpack("A2A2A2", "060711");
397nobodyさん:2006/07/11(火) 19:39:59 ID:???
>>982
my @date = ( '060711' =~ /(\d{2})/g ) ;
398nobodyさん:2006/07/11(火) 19:47:57 ID:???
>>393
>print @{[split /;/,$temp]}->[1];
多分、それを書いた人はデバッグしてる時に
print "@{[split /;/,$temp]}";
↑こんな感じでsplit後のデータを表示してた。

配列リファレンスのデリファレンスをすると、ダブルクォートの中に入れられる。
その名残が残ってるだけだと思う。
別に深く気にする事はない。
399392:2006/07/11(火) 19:52:07 ID:D6pM+gvD
>>396-397
サンクル!
unpackって関数知らなかった。色々使えそうだわいわい。
正規表現ってホント色んなことできるなぁ。
やり方は全然思い付かないけど・・・。
400393:2006/07/11(火) 19:59:25 ID:P82+nFT5
>>398
なるほど。HTMLに埋め込む時の手法ですね
@{[]}とか${\[]}だったかな。

>配列リファレンスのデリファレンスをすると、ダブルクォートの中に入れられる。
これはどういうことでしょう。

あ、つまりHTMLの中に入れられるみたいな意味ですね。
納得です。
401393:2006/07/11(火) 20:08:51 ID:P82+nFT5
すみません、久しぶりに来たのでもう一つ質問したいのですが。
宜しくお願いします。

アクセス解析を自分で遊びで作ったのですが、たまにアクセスから1分以内とかのだけみたいときがあります。

sprintf "%04s%02s%02s%02s%02s%02s",sub{shift()+1900,shift()+1,@_}->([gmtime(time+32400)]->[5,4,3,2,1,0]);

このフォーマットで、作ってる現在時間と記録されてる過去の時間の時間的比較ってどうやればいいですか?
今は1分なら100とかでやってしまてるのですが。

変換関数とかあるのでしょうか?mistyでは見つかりませんでしたが。
402393:2006/07/11(火) 20:20:59 ID:P82+nFT5
モジュールがあるようですね。datetimeっていう。
使わない場合はやはり簡単ではないようで。
数学の世界ですねきっと。
403nobodyさん:2006/07/11(火) 20:35:09 ID:???
>>401
待て待て待て
そのフォーマットなら単純に文字列比較するだけで良いはずだが。

my $limit = sprintf "%04s%02s%02s%02s%02s%02s",sub{shift()+1900,shift()+1,@_}->([gmtime(time-60)]->[5,4,3,2,1,0]);
if ($limit lt $date) { }
で一分以内になるはず。試してないが

後、この場合じゃ無駄だがgmtimeの逆をする関数ならTime::Localにある
ttp://search.cpan.org/~drolsky/Time-Local-1.12/lib/Time/Local.pm
404nobodyさん:2006/07/11(火) 20:42:15 ID:???
use POSIX qw(strftime); # とかなんとか
でいろいろ使えると思うけど。1900足したりしなくていいし。
405nobodyさん:2006/07/11(火) 20:44:44 ID:???
まさに「データファイルを見直せ」の典型ですね
406393:2006/07/11(火) 21:22:41 ID:P82+nFT5
>>403
おお!
モジュールを使うと、フォーマットやら細かい部分が変わってしまって
色々手を入れないといけなくなりそうだったので嫌だったのですが。

盲点でした。60秒前の設定で作り直せばよかったんですね。
それもltなんて知りませんでした。
いまさらltまで発見させてもらって最高です。
407393:2006/07/11(火) 21:24:30 ID:P82+nFT5
ところで
ltと>ってどうやって使い分けるんですか?

そもそも文字列を数値比較するなら>,==とかでいいとおもうのですが。
408nobodyさん:2006/07/11(火) 21:29:11 ID:???
数値比較しかないと、数値じゃない文字列の比較ができないことになる
409393:2006/07/11(火) 21:37:58 ID:P82+nFT5
>>408
???
a ne a
はわかるのですが、
1 lt 1
がわからないのです。
1 > 1とどういう差があるのか・・・
410nobodyさん:2006/07/11(火) 21:42:41 ID:???
>>409
だからなんで数値だけの文字列と比較するんだよ。

"hoge" と "1234" 比較して、"hoge" の方が大きい事を
判断したい場合もあるだろうが。
数値比較しか無いなら、"hoge"はいつでもゼロになる。
411393:2006/07/11(火) 21:48:06 ID:P82+nFT5
>>410
hogeに数字を与えるのですか?
hageとも違う数字を?

ちょっと実験してきます。
412393:2006/07/11(火) 21:50:40 ID:P82+nFT5
!!!!!

print "左辺の方が小さいです。" if "hage" lt "hoge";
print "左辺の方が小さいです。" if "hoge" lt "hage";

どうやら"hage"の方が小さいようです・・・・
どうなってるのですか?これ。
413nobodyさん:2006/07/11(火) 22:06:01 ID:???
a lt o だから
414nobodyさん:2006/07/11(火) 22:06:29 ID:???
簡単に言えば、
・一文字目は両方ともhで同じ('h' eq 'h')。
・二文字目はaよりもoのほうが後にある('a' lt 'o')
ので、hageよりもhogeのほうが大きい、と判断される。
この一文字一文字の比較はバイト列として行われるから、詳しくはASCIIコード表をじっくり眺めてくれ。

ちなみに、数値しか入ってこないはずの日時の比較になぜ文字列比較をしたのかと言うと。
この場合はまだ良いんだけど、後数桁増えた場合、数値として扱うと誤差が発生するため、固定長の場合は習慣的に。
> print 20060711213959123456;
2.00607112139591e+19
> print 20060711213959123456 < 20060711213959123455
1
415nobodyさん:2006/07/11(火) 22:24:42 ID:???
よくわからんがごちゃごちゃ変なことやらずにはじめからunix timeで(timeの戻り値をそのままで)
保持しておけば比較も簡単だと思うのだが、なぜわざわざ話をややこしくしたがる奴が多いの
だろうか。
416nobodyさん:2006/07/11(火) 22:51:13 ID:???
DARK SIDE OF TIMTOWTDI
417nobodyさん:2006/07/11(火) 23:02:30 ID:???
初心者スレだからあえて突っ込こんどく。

ほんとに誤差がでるの?@5.8.8
-------------
$\ = "\n" ;
print 20060711213959123456;
print 20060711213959123456 > 20060711213959123455
-------------
2.0060711213959e+20
1

自分の環境に合わせて、lt を使うかどうか判断しましょう
418nobodyさん:2006/07/11(火) 23:07:10 ID:???
>>415 に同意
書くときに localtime なりすればいいわけで、
これならたとえ 西暦 から ともだち暦 に変わったってデータの変更とか必要ないしな。
419nobodyさん:2006/07/11(火) 23:09:27 ID:???
lt知らなかったけど、可読性が下がる方向性しか見えてこないw、
420nobodyさん:2006/07/12(水) 00:23:20 ID:qvG7JsXw
perl初心者です。
今CGIを制作しているのですが、正規表現でおもいっくそ躓きましたorz

例えば「$nameが5文字以上、100文字以下でなければエラーを実行する。」
みたいな感じに「$name」に文字制限を掛けたいのですが・・・。
よろしくお願いします。
421nobodyさん:2006/07/12(水) 00:31:07 ID:cb+ZHaYE
length($name)
422nobodyさん:2006/07/12(水) 00:35:00 ID:qvG7JsXw
>>421
すいません。ありがとうございます・・・。
しかし、悩んでいるのはその先なんです・・・。それをどのように正規表現のパターンにはめればよいか・・・。
423nobodyさん:2006/07/12(水) 00:40:55 ID:???
正規表現じゃなくて、length() を使って条件分を書けば良いだけ
424nobodyさん:2006/07/12(水) 00:42:25 ID:???
>>420
正規表現で何がしたいのか書いてなくね?
425nobodyさん:2006/07/12(水) 00:54:54 ID:qvG7JsXw
>>424
「5文字以上、100文字以下」であることを調べたいと思ってるんですが・・・ orz
426nobodyさん:2006/07/12(水) 00:57:04 ID:???
unless (5 <= length($name) and length($name) <= 100) {
&error;
}
427nobodyさん:2006/07/12(水) 01:01:22 ID:???
翻訳します。

質問:
5文字以上100文字以下の文字列にマッチする正規表現が書きたい
回答:
出来無くないけど正規表現の使い方間違えてるよ
428nobodyさん:2006/07/12(水) 01:03:57 ID:???
unless ($name =~ /^.{5,100}$/) {
&error;
}
429nobodyさん:2006/07/12(水) 01:06:52 ID:w3I1i8Fs
print 2+4*3/2-1; # 7
print (2+4)*3/2-1; # 6(8が正しいはず)
print int((2+4))*3/2-1; # 8
となるのは何故でしょうか?
430420:2006/07/12(水) 01:13:25 ID:qvG7JsXw
あぁ・・・もう・・・
こんな低レベルな質問に・・・本当にありがとうございました orz
431nobodyさん:2006/07/12(水) 01:13:29 ID:cb+ZHaYE
print (2+4)         *3/2-1;
432nobodyさん:2006/07/12(水) 01:17:09 ID:???
納得しましたorz。ありがとうございました。
433nobodyさん:2006/07/12(水) 01:28:20 ID:???
$hoge = "a,b,c,d,e,f,g,h,................";
と「,」で区切られた文字列があるとして
その中の冒頭部分のいくつかの要素が欲しいとき
どうするのが一番メモリ食わずに済みますか?
例えば、上の文字列からbとcとdが欲しい場合、
(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge);
とするのがベストなんでしょうか?
434nobodyさん:2006/07/12(水) 01:38:13 ID:???
まぁ、しょうがないんじゃないの?
あとはsplitした結果の配列スライスを取るしかないね。
正規表現は処理として重いし。
データが絶対に1文字なら、substrで切ってからsplitするとか。

データが5000とかあって、3番目から100個取りたいとかいう事でなければ、
あまりメモリを気にしてもしょうがないよ。
perl使ってる時点で、かなりのメモリを喰ってる訳だから。
435433:2006/07/12(水) 01:46:55 ID:???
>>434
ありがとうございます。
多少のことなんか気にせずバリバリ書く方が気楽なんですけどね。
省メモリに凝りだすと、ついついつまらないことまでも気になって眠れませんw

ちなみにものすごくどうでも良いことだとは思うんですが
(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge);

(undef,$hage1,$hage2,$hage3,) = split(/,/,$hoge);
って、あらゆる点から見て全く同じ処理という解釈で良いんですかね?
436nobodyさん:2006/07/12(水) 01:52:13 ID:???
小手先だがsplitに第3引数を与えて余計な分解はしないようにするといいよ

(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge,, 5);
437nobodyさん:2006/07/12(水) 02:05:31 ID:???
>>435
質問の答えじゃないですが
perldoc -f split
で第3引数のLIMITを見てみて。単純にsplitするよりは効率いいかも。
438433:2006/07/12(水) 02:18:09 ID:???
>>436-437
なるほど、どこまで読み込むかの範囲指定できる引数を割り当てられるんですね。
って、以前にsplitの項を本で読んだときに絶対目にしてるはずなんだけどなぁ。
実際に使わないと身に付かない体質なのか・・・。
これは付けておくに越したことはないですね。可読性の点からも悪くないですし。
即、該当箇所全てに割り振らねば!
ありがとうございました!

undefで値を捨てるのと、そもそも値を未定義(?)にしておくのと何か違いがあるのか
分かる方いらっしゃいましたら、お暇なときにでも教えて下さい。
439nobodyさん:2006/07/12(水) 02:44:06 ID:???
>>435
>ちなみにものすごくどうでも良いことだとは思うんですが
>(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge);
>と
>(undef,$hage1,$hage2,$hage3,) = split(/,/,$hoge);
>って、あらゆる点から見て全く同じ処理という解釈で良いんですかね?

上はそのまま。
下は、
(undef,$hage1,$hage2,$hage3) = split(/,/,$hoge);
に最適化される。
440nobodyさん:2006/07/12(水) 02:56:50 ID:???
左辺にundef置いても警告されないんだ。いい事聞いちゃったw
441nobodyさん:2006/07/12(水) 04:55:16 ID:???
どうでもいいがundef 書くくらいだったら
my ( $hage1,$hage2,$hage3) = ( split/,/,$hoge)[1,2,3] ;
てスライス使わない?


442nobodyさん:2006/07/12(水) 09:45:38 ID:???
>>438
> これは付けておくに越したことはないですね。可読性の点からも悪くないですし。
> 即、該当箇所全てに割り振らねば!

何も考えずに即値をばらまくと後できっと忘れます。やるならコメント推奨。


> undefで値を捨てるのと、そもそも値を未定義(?)にしておくのと何か違いがあるのか
> 分かる方いらっしゃいましたら、お暇なときにでも教えて下さい。

undef って書かなくていいので、楽ちんな上にプログラムサイズを小さくすることができます。
いや正直「そもそも値を未定義(?)にしておく」が、どういう操作を指しているのか分からないので分かりません。
443nobodyさん:2006/07/12(水) 10:47:13 ID:???
>>420
日本語が含まれるのかどうかについて誰も触れていないんだが?
444nobodyさん:2006/07/12(水) 11:35:39 ID:???
>>441の方法が普通だよな。
(undef,$hage1,$hage2,$hage3) = split(/,/,$hoge);
なんて酷いの始めてみた。
445nobodyさん:2006/07/12(水) 11:38:48 ID:???
特に酷いとは思わない俺ガイル
446nobodyさん:2006/07/12(水) 11:50:40 ID:???
>>444
undef を左辺に置く手法は、何番目の要素をそれぞれ拾い、捨てているのか視覚的に分かりやすいというメリットもある。
リストの要素数が小さく、かつ一定である場合には特に。
447nobodyさん:2006/07/12(水) 11:55:26 ID:???
ダミーを用意しなくてもいい
スライスしなくてもいい
を考えて、warningが出ないなら有用だと思うが
448441:2006/07/12(水) 12:13:35 ID:???
軽い違和感を感じただけだから、>>446-447 の意見で納得した。
まあ機会があれば使うかもしれん。
>>393
>print @{[split /;/,$temp]}->[1];
の方は「 split のケースでは」一生使うことはない。

449nobodyさん:2006/07/12(水) 14:25:53 ID:???
プチ天狗になりそうだった自分を戒めてくれる流れだわ。
450nobodyさん:2006/07/12(水) 16:11:36 ID:x2NzMLn/
foreach $line (@log) {
 foreach $keyword (@keywords) {
  if ( index($line, $keyword) >= 0 ) {
    push (@result, $line);
    last;
  }
  }
}

こーんな感じで検索してるんだけど、
@keywordsの中身がHitしても次の行に行ってくれない、
というか@keywordsの複数の中身がhitすると同じ行が何回もpushされちゃう。
なんでなんでしょうか?
451nobodyさん:2006/07/12(水) 17:18:49 ID:???
>>450 のループ自体は正常に結果を吐くので他の要因だと思われ。
つーか index をそう使うの初めて見た
452nobodyさん:2006/07/12(水) 20:58:47 ID:???
grep
453nobodyさん:2006/07/12(水) 21:00:13 ID:???
>>446
視覚的にとかいう意味だと、スライスの方が数字なんだし読みやすい希ガス。

>>451
探す文字がパターンマッチを必要としないならindexの方が激速。
454nobodyさん:2006/07/12(水) 21:01:33 ID:???
復旧!
テストカキコついでに>>392 への遅レス
ダークサイドだが
my @date = grep {$_} split /(\d2})/, '060711' ;
ちう手もあるよん。
455nobodyさん:2006/07/12(水) 21:04:03 ID:???
>>454
ひどいな、そのコード…。
普通にunpackが一番早かろうに
456nobodyさん:2006/07/12(水) 21:10:09 ID:???
{ がぬけてもた。 /(\d{2})/ ね
>>454
そw 普段こんなの絶対使わないw
が、たまに
my $i = 0;
my %hash = map { $_ or $i ++ } split /(.{20})/, $hoge ;
とかしたくなって誘惑される。
だからダークサイド。
457nobodyさん:2006/07/12(水) 21:24:50 ID:???
>>453
>探す文字がパターンマッチを必要としないならindexの方が激速。
なるほど…今度使ってみよう。
>>456
それって20で割り切れなかったら…
まあ、承知のうえで書いてんでしょうけど。ダークサイド宣言してるし。
458nobodyさん:2006/07/12(水) 21:26:14 ID:Fw7S49xF
質問です。

perlで書かれたあるcgiからhtmlを読んでその中身を表示したいのですが、さらに一歩踏み込んで、そのhtmlの中でさらにperlで書かれたcgiを呼んで、そのhtmlを動的に変更して表示したいのですが、そんなこと可能ですか?
459すいません…:2006/07/12(水) 21:50:43 ID:???
ものすごく初歩的な事をお伺いして申し訳ないのですが、activeperlを
ダウンロードしたのですが、コマンドプロンプトでバージョンチェックを
しても、「バッチファイルとして認識していません」と表示されるのですが
どうすれば良いのでしょうか?
460nobodyさん:2006/07/12(水) 21:51:10 ID:???
>>457
一応対応はできる、がこんなことするくらいだったら
普通に hash 作成すべき。

split /(.{20})/, $hoge ;
push @_, '', pop @_ if @_ % 20 != 0 ;
my $i = 0;
my %hash = map { $_ or $i ++ } @_ ;

461460:2006/07/12(水) 21:59:24 ID:???
s/20/2/
orz...吊ってくる
462460:2006/07/12(水) 22:03:56 ID:???
@_ % 2 != 0 ;
スレ汚しすまん
463nobodyさん:2006/07/12(水) 22:36:08 ID:???
質問させてください
Perlでシェルスクリプト(useradd)を使用するにはどうしたらいいでしょうか?
464nobodyさん:2006/07/12(水) 23:02:43 ID:???
>>458
なんでそんなことせにゃならんのかかわからんがSSIでも使えば?
465nobodyさん:2006/07/12(水) 23:03:43 ID:l/BVmrr1
今WinXPとActivperlでプログラム作ってるんですが
これってPerlユーザーの主流じゃないようなんですが
何故ですか
466nobodyさん:2006/07/12(水) 23:08:41 ID:???
>>463
system "your script" ;
もしくは your script をバッククォートにてかこむ。
your script 部分にはコマンド単独実行時の
打ち込むものすべてを入れる。
467nobodyさん:2006/07/12(水) 23:18:33 ID:???
>>466さんを参考に以下を実行してみました。
#!/usr/bin/perl

$user = "aaa";
system "useradd $user";

エラーは出ないのですが、ユーザーが追加されてません。
なぜでしょうか?
468nobodyさん:2006/07/12(水) 23:30:16 ID:???
useradd ってコマンドがあるのね orz...

具具ってみたけど
useradd って管理者権限が必要でしょ。
sudo useradd か perl 自体の実行を su でするか
しないとだめなんじゃない?

力になれそうにありません。すまん。
469nobodyさん:2006/07/12(水) 23:39:41 ID:???
>>468さんありがとう
ちょっと質問変えてみます
Perlでシェルスクリプト実行するにはどうしたらいいでしょうか?
470446:2006/07/12(水) 23:41:57 ID:???
細かい話になるけれど。

>>453
> 視覚的にとかいう意味だと、スライスの方が数字なんだし読みやすい希ガス。

もちろんそりゃ読みやすいほうを使ったらよろしいんです。いつでもどちらかがイイってな話はしてないですから。

「視覚的に」と言うからには、数値のリストを添字として読み、それを元にスライスされる前のリストからどの値を取り出してどの値を捨てたのかを、脳内変換すること無しに、その姿を *目で見て* 把握できることを指しています。
逆から言えば、その意味では添字によるスライスの表現は、左辺 undef と比較した場合、視覚的ではないと言わざるを得ないでしょう、ということです。
471nobodyさん:2006/07/12(水) 23:43:05 ID:3OAigznj
perlやっててmysqlでつまづきました
CGI経由でsql文を実行しようとすると動きません
コンソールからやっても動かないのでsql文がおかしいと思います。

mysql> update todo set content = aho where id = 9;
ERROR 1054 (42S22): Unknown column 'aho' in 'field list'

以上のエラーが出ています。
mysqlのバージョンは4.1.13です。
よろしくお願いいたします。
472nobodyさん:2006/07/12(水) 23:44:44 ID:???
>>469
それじゃ同じ答えしか返ってこない。
system使えとか、``使えとか、qx() しろとか。
systemの戻り値を調べるか、$! を見て。
473nobodyさん:2006/07/12(水) 23:46:15 ID:3OAigznj
''入れたら自己解決しました。
本当にありがとうございました。
474nobodyさん:2006/07/12(水) 23:53:16 ID:???
>>469
>ちょっと質問変えてみます
>Perlでシェルスクリプト実行するにはどうしたらいいでしょうか?
まあ、同じ答えになるんだけどもちょっとだけ詳しく。
「/PATH/hoge.sh を引数 piyo つきで実行するなら」
system "sh /PATH/hoge.sh piyo" ;
「STDOUT を perl の変数に直接入れたいなら」
open EXE, "sh /PATH/hoge.sh piyo|" ;
@data = <EXE> ;
「STDERR とか細かなところまで制御したいなら」
perldoc IPC::Open3あたり
475nobodyさん:2006/07/13(木) 00:17:16 ID:???
>>469
Inline::Bash を書いて CPAN に上げてください。
応援しています。
476nobodyさん:2006/07/13(木) 00:23:07 ID:???
>>465
Perl は UNIX 上の仕事をやっつけるために生まれ、UNIX 系のシステムを中心に普及したから。
でも主流じゃないことを気に病むことはないよ。まずは悩む代わりに、その時間を使ってコードを書くんだ。
477nobodyさん:2006/07/13(木) 00:26:45 ID:???
>469
`
478nobodyさん:2006/07/13(木) 00:32:23 ID:???
>>453
>探す文字がパターンマッチを必要としないならindexの方が激速。

あんま誤解の生じること言わないほうがいいw
479nobodyさん:2006/07/13(木) 00:38:17 ID:???
>>478
一般に正しいと思うけど。
(最適化のかかる)オートマトン作らなくて良いパターンでなければ、
indexの方が遥かに安価で速いだろう。
480469:2006/07/13(木) 00:39:17 ID:???
うーん。できない・・・
481nobodyさん:2006/07/13(木) 00:45:41 ID:???
>>469 は管理者権限の意味を理解しているのか小一時間(ry
482nobodyさん:2006/07/13(木) 00:48:22 ID:???
ここWebProg板だから、CGIでuseraddしようとしてたりして…。
483nobodyさん:2006/07/13(木) 00:48:54 ID:???
>>479
正しくないw
ベンチとってみればわかるけど

A1 $_ =~ /hoge/
A2 index($_, 'hoge')

my $word = 'hoge';
B1 $_ =~ /$word/
B2 index($_, $word)

A1 A2 はほぼ同じ速さで、
B1 は B2 より速い。

index($_, $word[1]) or index($_, $word[1]) ・・・
より
/$word[0]/ or $word[1] ・・・
のが速い。

$_ が 'aaaaaaa......' で $word が 'baaaaaaaaaaaa' とかいう特殊な場合は考えないでね。
484469:2006/07/13(木) 00:48:56 ID:???
root権限でcgiを実行ってことですか?
485nobodyさん:2006/07/13(木) 00:50:07 ID:???
>>483 訂正
× /$word[0]/ or $word[1] ・・・
○ /$word[0]/ or /$word[1]/ ・・・
486nobodyさん:2006/07/13(木) 00:50:10 ID:???
>>479
日本語の問題だと思うけど。
「探す文字がパターンマッチを必要としないなら(最適化がかかるので)indexの方が激速なんてことはない。」
487458:2006/07/13(木) 00:52:59 ID:aY2uz4D9
>>464
レスありがとうございます。
もう少し具体的に質問します。

まずparent.cgiがあります。ここやってることはhtmlテンプレートを使ったchild.htmlファイルを読み込んで表示させるだけです。つまり
$template = HTML::TEMPLATE->new(
  filename => 'child.html',
);
print $template->output;
のような感じです。


このchild.htmlでは
<!-- TMPL_INCLUDE NAME="hoge.html" -->
のようにhtmlファイルを読み込んでいます。

しかし今回このhoge.htmlの代わりにhoge.cgiを使いたいのです。つまり静的なhtmlファイルではなくcgiを使ってここに表示される内容を動的に変化させたいわけです。これをするのにいい方法ありますでしょうか?
488nobodyさん:2006/07/13(木) 01:04:37 ID:???
>>487
静的なhtmlをincludeするんじゃなくて、そこで普通にテンプレートを使えば
実質お望みの事ができると思うんだけど…。
489nobodyさん:2006/07/13(木) 01:05:37 ID:???
>>487
いろいろ方法はあるだろうけど、全く別の CGI を呼ぶ 「いい方法」 というなら SSI が 「いい方法」 だと思うぞ。
490nobodyさん:2006/07/13(木) 01:06:25 ID:???
実はそこに入れたいのは カウンター とかいう話じゃねえのかなw
491nobodyさん:2006/07/13(木) 01:17:32 ID:???
質問
パーミッション777のディレクトリだとmkdirできるのですが
755だとできません。777だとセキュリティ的に問題ですよね?
755のディレクトリ直下に新規ディレクトリを作成するにはどうしたらいいでしょうか?
492nobodyさん:2006/07/13(木) 01:29:08 ID:???
>>484
よく分かってないなら、そういうプログラムは組まない方がいい。
493nobodyさん:2006/07/13(木) 01:29:35 ID:???
>>491
じゃー、chmod で 777 にしてから mkdir して 755 に戻せば?
494nobodyさん:2006/07/13(木) 01:43:02 ID:???
>>493
777のディレクトリだとchmodできましたが
755のディレクトリだとchmodできませんでした・・・
495487:2006/07/13(木) 02:29:43 ID:aY2uz4D9
>>487
知識不足で申し訳ないです。普通にテンプレートを使うとはどういうことでしょう?テンプレートでcgiを実行するようなものがあるんですか?

>> 489
SSIで試してみました。parent.cgiから読み取るのをchild.shtmlにしてその中で<!--#exec cmd="perl hoge.cgi" -->として実行してみました。

結果普通にchild.shtmlを見ると実行が確認できたのですが、parent.cgiの中でshtmlを読み込んでしまうとSSIが実行されないようでダメでした。

>>490
カウンターではありませんw
496nobodyさん:2006/07/13(木) 02:50:05 ID:???
>>495
テンプレート使ってるってことは、そもそもCGIで動いてるんでしょ。
その場で動的なページ作ればいいだけでは。

テンプレートで静的なhtmlを読み込んで、
さらにそこからCGI叩いて動的なページを、、、なんて考える前に。
497495:2006/07/13(木) 03:13:47 ID:aY2uz4D9
>>496
レスありがとうございます。

しかしそのテンプレートのhtmlの"ある部分"にCGIの結果を入れたいんですよ。そこはスタイルシート等で位置が厳密に決まっているのでその部分だけ元のparent.cgiでhoge.cgiを呼び出してってのは難しいんじゃないかと思ってます。
498nobodyさん:2006/07/13(木) 03:25:44 ID:???
じゃあもう iframe でいいじゃん。それかAjax
499nobodyさん:2006/07/13(木) 06:06:02 ID:???
>>483
言いたい事はわかるが、
それはパターンマッチを必要とする条件じゃないのか?

ただの文字列を探すならindexしかないだろ。
500nobodyさん:2006/07/13(木) 06:14:58 ID:???
Cとかでは確かにindexは激速だが、Perlはもしかしたらindexが正規表現ライブラリの
皮をかぶってるかもしれないから、ソース見るかベンチ取るかしてみないと(ry
501nobodyさん:2006/07/13(木) 06:17:53 ID:??? BE:309540375-#
昔indexの方が速かった覚えがあるので
ふつーに簡単なベンチ取ったら
indexの方が2倍 速かったんですけど
当然っちゃー当然の結果やね
502nobodyさん:2006/07/13(木) 06:32:39 ID:???
こういう結果もあるぞ。

http://x68000.q-e-d.net/~68user/webcgi/search-1.html
503457:2006/07/13(木) 07:33:25 ID:???
気分良く寝てたので話題に乗りおくれた。
>>502
横レスだけどリンク先を良くよんだら?
search-2.cgi がせめて and 検索だったらいいんだけどリンク先は
アンフェアな比較だよ。(まあ、そういう目的で作ったんんじゃない
だろうけど)
以下は寝起きで確認したベンチマークのソース。
#!/usr/bin/env perl -w
#use strict ;
use Benchmark ;
my $str1 = ( 'a' x 30 ) . 'hoge' . ( 'a' x 10 ) ;
my $str2 = ( 'a' x 30 ) . ' hoge ' . ( 'a' x 10 ) ;
sub cont1(){ $str1 =~ /hoge/ }
sub cont2(){ $str2 =~ /hoge/ }
sub test_index1(){ index $str1, 'hoge' }
sub test_index2(){ index $str2, 'hoge' }
timethese 500000, { o0 => 'cont1' , o1 => 'cont2' , o2 => 'test_index1' , o3 => 'test_index2' } ;
================
Benchmark: timing 500000 iterations of o0, o1, o2, o3...
o0: 1 wallclock secs ( 1.66 usr + 0.01 sys = 1.67 CPU) @ 299401.20/s (n=500000)
o1: 2 wallclock secs ( 1.66 usr + 0.02 sys = 1.68 CPU) @ 297619.05/s (n=500000)
o2: 1 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 347222.22/s (n=500000)
o3: 1 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 347222.22/s (n=500000)
504nobodyさん:2006/07/13(木) 07:46:36 ID:???
search-3.pl って eval でモロ高速化してんじゃん…
search-2 が and 検索であろうとなんであろうと、単純な index と正規表現
の速度比較のソースにはならんな。
505nobodyさん:2006/07/13(木) 13:17:19 ID:???
>>500
>Perlはもしかしたらindexが正規表現ライブラリの
>皮をかぶってるかもしれないから
それは普通に考えてありえない…。
506nobodyさん:2006/07/13(木) 15:37:15 ID:???
>>503

>>483 でやってみて。
検索文字が文字列か変数かどうかで結果が変わるんだよ。
507nobodyさん:2006/07/13(木) 16:04:15 ID:???
>>506
>>503 と同じようなのを書いてベンチ取った。
何度かやってみたが、変数に入れてもindexの方が速かった。

#!/usr/bin/perl
use Benchmark;

my $str1 = ('a' x 30) . 'hoge' . ('a' x 10);
my $str2 = ('a' x 30) . ' hoge ' . ('a' x 10);

sub test_reg1 { my $hoge = 'hoge'; $str1 =~ /$hoge/; }
sub test_reg2 { my $hoge = 'hoge'; $str2 =~ /$hoge/; }
sub test_index1 { my $hoge = 'hoge'; index($str1, $hoge); }
sub test_index2 { my $hoge = 'hoge'; index($str2, $hoge); }

timethese 500000, {
 reg1 => 'test_reg1',
 reg2 => 'test_reg2',
 idx1 => 'test_index1',
 idx2 => 'test_index2',
};

idx1: 1 wallclock secs ( 0.83 usr + 0.00 sys = 0.83 CPU) @ 602409.64/s (n=500000)
idx2: 0 wallclock secs ( 0.83 usr + 0.00 sys = 0.83 CPU) @ 602409.64/s (n=500000)
reg1: 1 wallclock secs ( 1.00 usr + 0.00 sys = 1.00 CPU) @ 500000.00/s (n=500000)
reg2: 0 wallclock secs ( 1.00 usr + 0.00 sys = 1.00 CPU) @ 500000.00/s (n=500000)
508nobodyさん:2006/07/13(木) 16:11:59 ID:???
>>506
ちなみに >>483 みたいに orで繋ぐのもやってみたけど、
やっぱり indexの方が速かった。
509nobodyさん:2006/07/13(木) 16:38:50 ID:???
>>508
あー、ほんとだ。

でもね、検索対象のサイズを大きくするにしたがって逆転していくみたい。

my $str1 = ('a' x 10000) . 'hoge' . ('a' x 1000);
my $str2 = ('a' x 10000) . 'hage' . ('a' x 1000);

とかでやってみておくれ。 これは 11k だけど、うちの環境では 1k あたりから差がではじめた。
510nobodyさん:2006/07/13(木) 17:11:02 ID:???
>>509
そりゃ長くなれば BM法にアルゴリズム変えるからね。正規表現の方は。
511nobodyさん:2006/07/13(木) 17:29:16 ID:???
結局長さとか対象文字列に依存して違う結果が出るので
気になる人はよく考えるなり実験するなりして選択しろと
いうことか。
512nobodyさん:2006/07/13(木) 17:33:49 ID:???
ただ正規表現でいつまでもオプショナルな文字列が無い
(オートマトン作らなくて良い)なんて事は無いし。
513nobodyさん:2006/07/13(木) 19:41:52 ID:???
index使わないコーディングスタイルはKENTのせい。
514nobodyさん:2006/07/13(木) 19:59:46 ID:???
>>513
お前が働かないのは誰のせい?
515nobodyさん:2006/07/13(木) 20:09:12 ID:IeuSyhG1
いまだKENT信者っていたんだなw
516nobodyさん:2006/07/13(木) 20:52:55 ID:???
あれ? KENTってindexを使っているんじゃなかったっけ?
517nobodyさん:2006/07/13(木) 21:53:37 ID:???
パターンを詰め込んだ変数でevalで局所化もせずぐりんぐりんじゃなかった?
518nobodyさん:2006/07/13(木) 21:58:11 ID:???
KENT 曰く
「それでもPerlは動いている」
519nobodyさん:2006/07/13(木) 22:11:56 ID:Ms2xB21u
print "location:hoge.gif\n\n";

アクセス解析用のcgiで出力を上記のようにしています。
自分自身先日winXPのIE7のベータ版にブラウザを変えて、気付いたのですが、
キャッシュされてしまってページ間の移動時に思うように動作しないことがあります。

これはベータ版のバグかもしれませんが。普通はcgiファイルをキャッシュして読み込みを省略することはないと思うので。
それでキャッシュ対策のヘッダを付け加えたいのですが、
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="Tue, 20 Aug 1996 14:25:27 GMT">
これのPERLヘッダ?版はどう記述すればいいでしょうか?

宜しくお願いします。
520nobodyさん:2006/07/13(木) 22:22:32 ID:Ms2xB21u
print "Pragma: no-cache\n";
print "Cache-Control: no-cache\n";
print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n\n";

一応こんな感じかなと思いますが、あってるのでしょうか?
http://www.gac.jp/article/index.php?stats=question&category=10&id=11811&command=msg
ここではどうやらNNにはこれでは残ってしまうように書いてあるのですが。
521nobodyさん:2006/07/13(木) 22:23:30 ID:???
>>519
ってか Content-type 出すときに Last-modified とか一緒にだしてもダメなん?
522519:2006/07/13(木) 22:24:37 ID:Ms2xB21u
>>520>>519ですすみません。
要は私の場合は戻るボタンが効かないように、ではなくて、
アクセス解析CGIがちゃんと動作することと、
チャットで使ってる、
<meta http-equiv="Refresh" content="15">
がちゃんと動作することなのですが。
523519:2006/07/13(木) 22:25:35 ID:Ms2xB21u
>>521
ありがとうございます。
その書き方がイマイチ自身がもてなかったので投稿して確認に参りました。
524nobodyさん:2006/07/13(木) 22:26:24 ID:???
ダミーの値、たとえばtimeをアドレスにくっつけて別のURLにすれば解決。
525nobodyさん:2006/07/13(木) 23:13:19 ID:???
'' and '' are identical (not copied) at test.cgi line 60

というエラーが出たんですが、これはどういうときに出るもんなんですか?
test.cgiの60行目で''と''が同じになってるよ(コピーされたとかじゃなくてな)
ってこと?意味が分かりません。
526525:2006/07/13(木) 23:16:07 ID:???
ちなみに60行目付近はこんな感じです。

59行目}elsif($action eq 'move'){
60行目&move;
61行目&move_complete;
62行目}elsif(......
527nobodyさん:2006/07/13(木) 23:29:36 ID:???
>>525
シェルが吐いてるエラー。
どっかで cpしてるんだろうけど、コピー元とコピー先が同じだと出る。
528525:2006/07/13(木) 23:46:26 ID:???
>>527
該当箇所とは全然違うところが原因ってことですか。
コピーなんてしてたっけなぁ…。
レスありがとうございました!
529nobodyさん:2006/07/14(金) 00:05:57 ID:???
Perlプログラムがおいてあるフォルダの中に、「temp」という名前のフォルダがあります。
この「temp」フォルダの中にある各フォルダの名前を$dirnameとしましょう。
各フォルダの中に、
{
$dirname
}
とだけ書かれた、「test.txt」という名前のファイルをそれぞれ新しく作りたいんです。

#!/usr/bin/perl
opendir DIR, "temp" or die "can't open temp\n";
@dir = map { -d "temp/$_" ? $_ : '' } readdir DIR;

foreach $dirname (@dir) {
chdir "./$dirname";
open OUT, ">test.txt" or die "can't create the file\n";
print OUT "{\n";
print OUT "$dirname\n";
print OUT "}\n";
close OUT;
chdir "..";
}

close DIR;
こんな感じにプログラムを書いてDOSプロンプトから実行したのですが何も起きません・・・
どうすればいいのか教えていただけないでしょうか?
530525:2006/07/14(金) 00:20:17 ID:???
60行目の
&move;を別の名前に変える動いた・・・なぜ??
逆に59行目の'move'を別の名前に変えただけでは同じエラーが。
531nobodyさん:2006/07/14(金) 00:26:19 ID:???
>>529
とりあえず、mapで書いてる行をgrepで書き直す。
@dir = grep { -d "temp/$_" && !/^¥./ } readdir(DIR);
532529:2006/07/14(金) 00:57:49 ID:???
>>531
そのままコピペしてもう一度実行してみました。
が、駄目…。
533nobodyさん:2006/07/14(金) 01:07:41 ID:???
横だけど
print @dir ; か
chdir "./$dirname" or die してみそ

@dir の中身は
./temp/hoge
./temp/piyo
じゃなく
hoge
piyo
になるYO @OSX
534nobodyさん:2006/07/14(金) 01:11:29 ID:???
>>529
foreachの前の時点で@dirに期待した値が入ってるかどうかぐらいは
確認して問題の切り分けをしろよ。

あとchdirも失敗することがあるので or dieしとけ。
535nobodyさん:2006/07/14(金) 01:13:56 ID:???
質問はしてくるけど、何も考えないのか。
誰かがなんか書いたらそれコピペして動くかどうかだけ?
なんだかなぁ。
536nobodyさん:2006/07/14(金) 01:14:40 ID:???
わざわざ chdir せずに
open OUT, "> temp/$dirname/test.txt" or die "can't create the file\n";
ってすればいいじゃない
537nobodyさん:2006/07/14(金) 01:21:07 ID:???
chdir でやるにしても foreach ループの前で chdir "temp/" が必要だしな。
538529:2006/07/14(金) 01:27:17 ID:???
>>536
できました!!!
ものすごく賢いやり方ですね。

>>534>>533
chdirがうまくいってなかったというか、どうやら相対ディレクトリ名の指定とかが根本的
にわかっていなかったようです。openでカレントディレクトリも変わるんだと思ってました。

>>535
(・∀・)

みなさんどうもありがとうございます。
おかげさまで相対ディレクトリ名の指定ということに関してだいぶ理解が進みました。
539nobodyさん:2006/07/14(金) 02:04:03 ID:???
あれ、chdir の有効範囲って local だったっけ?
そもそも1回目の
chdir "./$dirname";
でもし成功して temp/hoge/ になっちゃった場合、2回目はそこから chdir だから temp/hoge/fuga/ とかなんじゃねの?
540nobodyさん:2006/07/14(金) 02:23:45 ID:???
>538
フルパスも相対パスも知らずにファイル扱ってたのか((( ;゚Д゚)))
541nobodyさん:2006/07/14(金) 02:33:40 ID:???
>>539
>>529 のコードではファイルへの書き込みを行なった後に chdir ".." してるから
temp/ → temp/hoge/ → temp/ と戻るはず。

でもやっぱり読みづらいから、カレントディレクトリはあんまり変えて欲しくないなぁ。
542nobodyさん:2006/07/14(金) 16:30:45 ID:???
-dはsymbolic linkのリンク先がディレクトリの場合も真を返すので、
前提条件でそういうのはないならOKだが一般的にはchdir ".."では
戻れないかもしれない。

perlのchdirにはファイルハンドルやディレクトリハンドルを渡せるので、
戻りたいディレクトリを開いておいてこっちを使うほうが安全。

543nobodyさん:2006/07/14(金) 18:02:15 ID:IyAZlhFk
メールの標準入力からの取得を考えています。
qmailなのですが、perlにパイプさせるにはどうしたらよいでしょうか?

sendmailなら/etc/aliases でできますよね?
544nobodyさん:2006/07/14(金) 18:18:27 ID:??? BE:309540757-#
545nobodyさん:2006/07/14(金) 19:43:53 ID:???
ttp://www.uploda.org/uporg445281.txt

上記の掲示板に投稿する際のコード入力のスクリプトを作ったんですが
時たまコード入力より下が表示されなくなってしまいます。
どうすれば改善していいか分かりません。
どなたか改善よろしくお願いします。
546nobodyさん:2006/07/14(金) 19:50:38 ID:???
>>545
<form>タグが無い。
<table>タグも無い。
下から5行目、==&gt;と書くべき所で、'==>' と書いている。
547nobodyさん:2006/07/14(金) 19:55:39 ID:???
>>545
というか、sub code 自体をどこからも呼んでない…。
sub error は存在しない。
何がしたいの?そこからして不明。
548nobodyさん:2006/07/14(金) 19:59:34 ID:???
掲示板の一部です。
削除パスワードの下に&code;で呼び出して使ってます。
sub errorはあります。

で何をしたいかと言うとどうやってもコード部分が原因だと分かっていてもたまにコード部分からしたが消える
のが直せないので直してほしいわけです。
549nobodyさん:2006/07/14(金) 20:04:26 ID:???
直して欲しいなら全部晒せよ
550nobodyさん:2006/07/14(金) 20:05:56 ID:???
>>548
そんな一部しかないんじゃ分からん…。

とりあえず、>>546 の通り&code の中でHTML表示してる部分、
tableタグの開始も終了も無いんだが…。そこが一番あやしい。
ちゃんとtableタグ入れてみたら?
それさえ分からなければ、PerlじゃなくてHTMLの質問だよ。
551nobodyさん:2006/07/14(金) 20:08:03 ID:???
すんません・・・。
http://livetool.ty.land.to/aska/aska.cgi
ココに問題の掲示板とソースをのっけてあります。

数回更新ボタンを押していると表示されなくなりますのでそれを改善したいのです。
よろしくお願いします。
552nobodyさん:2006/07/14(金) 22:04:47 ID:LnOAoBN3
mysqlとperlで会員サイト作ってみたいのですが
よい参考書を教えてください
553nobodyさん:2006/07/14(金) 22:11:09 ID:???
>>552
WEb制作板池
554nobodyさん:2006/07/14(金) 22:26:32 ID:cNzjTfEo
>>552
その程度は参考書などいらない。
というか基本的にプログラム組むのに参考書なんていらない。

http://www.rfs.jp/sb/index.html
ここに書いてある内容を全て理解・・しなくても簡単にそのくらいは作れる。
まずは自分のパソコンに仮想環境を作ることが先決だ。
そうすればどれだけ程度の低い話なのかわかる。

優れたプログラムを組めるかどうかは人によって優劣がでるが、
最低限動くものなら健常者であれば誰でも可能。
555nobodyさん:2006/07/14(金) 23:28:12 ID:???
確かに作るだけならその通りなんだが…
WebProgは脆弱性があると、攻撃される危険が付きまとうことも忘れないでくれ。

と言うことで最低限ここは読んでおくべき。
ttp://www.ipa.go.jp/security/awareness/vendor/programming/
出来ればこの辺もね
ttp://www.jumperz.net/texts/csrf.htm
556nobodyさん:2006/07/15(土) 13:04:39 ID:FLr1xmaF
ありがとうございます>>553-554
557nobodyさん:2006/07/15(土) 19:12:52 ID:???
あの>>551の件は・・・・。
558nobodyさん:2006/07/15(土) 19:19:39 ID:???
>>557


>#乱数の作成
>$rand1 = int(rand(10));



$rand1 = int(rand(10)) + 1;

と末尾に+1しろ。
559nobodyさん:2006/07/15(土) 19:25:01 ID:???
今の、このスレの空気は以下の成分からなってます。
1). 自力でつくってんだったら協力したるのに
2). 向うの掲示板に問い合わせろよ



3). KENT かよ!
560nobodyさん:2006/07/15(土) 19:41:55 ID:???
>>559
だいたい合ってるwwwww

&code; とか気持ち悪いな。暗黙に &code(@_); と渡されることを知ってての諸行かな。
せめて &code(); とかにしてほしいなあ。
561nobodyさん:2006/07/15(土) 19:48:58 ID:???
>>558
ありがとうございます。
文法的にも間違っていたようです。

>>559
すべてではないですが大半は作りましたが・・・・・。
562nobodyさん:2006/07/15(土) 19:53:50 ID:???
たいはん 【大半】
全体の半分以上。過半。大部分。副詞的にも用いる。

へぇ・・・。
563nobodyさん:2006/07/15(土) 19:55:13 ID:???
>>560

>せめて &code(); とかにしてほしいなあ。

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
と釣られてみるテスト
564nobodyさん:2006/07/15(土) 20:04:58 ID:???
>>561
ほんとかどうか知らんが、おれは KENT であろうとなかろうと問い合わせ先が記入されてるソースに関してのレスは
つけんぞ。

おまえさんがさきに「この部分が自作です」といえば
話は別になるときもあるが。
565nobodyさん:2006/07/15(土) 20:06:20 ID:???
改行忘れorz...
566nobodyさん:2006/07/15(土) 20:38:18 ID:???
KENTもう配布やめてくれないかな。
ダメな子が増えて困る。
567nobodyさん:2006/07/15(土) 20:45:33 ID:???
KENT便利だな

少なくともチャント動くし
568nobodyさん:2006/07/15(土) 21:34:29 ID:???
× チャント動く
○ 動きはする
569nobodyさん:2006/07/15(土) 21:59:01 ID:???
KENT使ったこと無い
570nobodyさん:2006/07/15(土) 22:15:52 ID:???
KENTしか使っていない。
571nobodyさん:2006/07/15(土) 23:50:29 ID:???
KENTの何がいいかって、セキュリティとか全然考えてないとこだよな。
攻撃できまくり☆(ゝω・)v
572nobodyさん:2006/07/16(日) 00:07:06 ID:???
terra大先生の遺作がまだアチコチに残っている。
外部から任意コマンド実行可能なまま。
573nobodyさん:2006/07/16(日) 06:07:21 ID:???
えーw どんな設計したらそんなことになるんだろw
574nobodyさん:2006/07/16(日) 13:59:39 ID:pJTY6Rn5
正規表現でマッチした方の値を取る方法が分かりません。
例えば
$hoge = '2743AB5837C9849';
というような文字列があるとして
$hoge =~ s/\D//g;
とした場合に\Dに該当する方(ABC)の値を取りたいんですが
どうすれば良いんでしょうか?
575nobodyさん:2006/07/16(日) 14:07:23 ID:???
>574
$&
576574:2006/07/16(日) 14:21:08 ID:pJTY6Rn5
>>575
ありがとうございます。
マッチ変数というのがあるんですね。

ttp://www.rfs.jp/sb/perl/02/09.html
>後方参照の変数には上記のほかに、マッチ変数 $& $` $' $+ があります。これらの変数を使うと
>プログラム内のすべての正規表現の処理が遅くなるので、注意して使ってください。

という記述があったんですが、できることなら使わない方が良い代物なんでしょうか。
それとも多用がいけないのであって、1、2箇所であれば問題ないんでしょうか。
577 ◆TWARamEjuA :2006/07/16(日) 14:46:10 ID:??? BE:3267465-#
違う変数に入れちゃっても良いような。
($hage = $hoge) =~ s/\D//g;
578nobodyさん:2006/07/16(日) 14:48:17 ID:???
>>576
> という記述があったんですが、できることなら使わない方が良い代物なんでしょうか。
> それとも多用がいけないのであって、1、2箇所であれば問題ないんでしょうか。
1回でも使っている箇所があると、全ての正規表現が遅くなる。
マッチ変数が使われているかどうか調べるためのモジュールはDevel::SawAmpersand
579nobodyさん:2006/07/16(日) 14:56:43 ID:pJTY6Rn5
>>577-588
ありがとうございます。
ちょっと落雷がヤバイので一旦PCの電源落とします。
落ち着いたらそのときまたレスします。すみません。
580nobodyさん:2006/07/16(日) 15:07:17 ID:???
速度気になるんだったら、
my @hit = () ;
push @hit, $1 while $hoge =~ s/(¥D)// ;
みたく $1 を使えば?
つーか $& 使ったことないなあ。オレ。
581nobodyさん:2006/07/16(日) 15:54:56 ID:???
$1使ったほうが遅いはず
582nobodyさん:2006/07/16(日) 16:08:19 ID:???
誰かベンチとってkt
583bench 魔:2006/07/16(日) 16:56:41 ID:???
お前がやれよ!まあ、暇だからやったけどさ。
===そーす===
my $str1 = 'a' x 6 . 'hoge' ;
$str1 = $str1 x 100 ;
sub test1(){ my ( $tmp, @hoge ) = $str1 ; push @hoge, $& while $tmp =~ s/hoge// ; }
sub test2(){ my ( $tmp, @hoge ) = $str1 ; push @hoge, $1 while $tmp =~ s/(hoge)// ; }

#timethese 10000, { test2 => 'test2' } ;
timethese 10000, { test1 => 'test1', test2 => 'test2' } ;
===実行結果===
1. ソース内に $& 蟻
Benchmark: timing 10000 iterations of test, test2...
test: 13 wallclock secs (13.22 usr + 0.10 sys = 13.32 CPU) @ 750.75/s (n=10000)
test2: 14 wallclock secs (13.34 usr + 0.10 sys = 13.44 CPU) @ 744.05/s (n=10000)

2. ソース内に $& なし(test1 をコメントアウト
Benchmark: timing 10000 iterations of test2...
test2: 14 wallclock secs (13.32 usr + 0.10 sys = 13.42 CPU) @ 745.16/s (n=10000)
584bench 魔:2006/07/16(日) 16:57:32 ID:???
$& だけじゃ差が出ないのか?と思い、
==========
で、test1 を以下の様に変えて
sub test1(){
 my ( $tmp, @hoge, @fuga, @piyo ) = $str1 ;
  ( push (@hoge, $& ),
   push (@fuga, $`),
   push(@piyo, $' )) while $tmp =~ s/hoge// ; }

実行してみたが…
Benchmark: timing 10000 iterations of test, test2...
test: 26 wallclock secs (24.80 usr + 0.22 sys = 25.02 CPU) @ 399.68/s (n=10000)
test2: 14 wallclock secs (13.28 usr + 0.08 sys = 13.36 CPU) @ 748.50/s (n=10000)
test2 の結果は余りかわらず。

prelre にまで書いてある記載だから $& とか使ったら遅くなるケースが必ずある筈なんだけどなあ。
実際のソースで自分で確かめるしかねーな。
585nobodyさん:2006/07/16(日) 17:10:42 ID:???
>>583-584
文句言いながらやる君が好きだ。

でも、
> これらの変数を使うとプログラム内のすべての正規表現の処理が遅くなるので、注意して使ってください
だから、同じ時に計測すると $1 の方も遅くなっちゃうんじゃないのかな?
比較じゃなくて構わないから、参考に単独での速度を計ってみてくれるといいかも。

できれば
> @hoges = $hoge =~ /\D/g;
系と
> push @hoges, $1 while $hoge =~ /(\D)/g ;
系とでも比較してあるとなお。
586bench 魔:2006/07/16(日) 17:51:19 ID:???
>だから、同じ時に計測すると $1 の方も遅くなっちゃうんじゃないのかな?
>比較じゃなくて構わないから、参考に単独での速度を計ってみてくれるといいかも。
583 の 2.の条件が $& を排除した形のものデス。
$& の入っている行をすべてコメントアウトしました。

お約束「あなたの為にやるんじゃないんだからね!!」
>>583 のソースに
sub cont (){ my ( $tmp, @hoge ) = $str1 ; @hoge = $tmp =~ /hoge/g ;}
を加えて実行 ( 実行名 cont )。実行回数は 5 万回に変更
Benchmark: timing 50000 iterations of cont, test1, test2...
cont: 49 wallclock secs (48.24 usr + 0.34 sys = 48.58 CPU) @ 1029.23/s (n=50000)
test1: 67 wallclock secs (65.77 usr + 0.39 sys = 66.16 CPU) @ 755.74/s (n=50000)
test2: 69 wallclock secs (66.33 usr + 0.53 sys = 66.86 CPU) @ 747.83/s (n=50000)

そこから $& が入った部分を全削除して実行
Benchmark: timing 50000 iterations of cont, test2...
cont: 44 wallclock secs (42.59 usr + 0.33 sys = 42.92 CPU) @ 1164.96/s (n=50000)
test2: 69 wallclock secs (66.67 usr + 0.54 sys = 67.21 CPU) @ 743.94/s (n=50000)

…なるほど、test2 ( $1 を利用 )にはもともとコストが掛ってて $& の影響が表われなかった
だけか。
一箇所の正規表現だけだと、$1 より $& を使った方が速いがソース全体だと影響を及ぼす
という妥当な結果かな。

587nobodyさん:2006/07/16(日) 18:23:45 ID:???
>>586
オツカレ!

つまり $& を使うとそもそも結果を伴う $1 の処理には影響ないけど、
普通の正規表現も結果をとることになるから総合的に遅くなる、ってわけだな。

結局、>>574の場合、一番早いのは

my @matchs = $hoge =~ /\D/g;
$hoge =~ s/\D//g; # ※より早い形→ $hoge =~ tr/0-9//cd;

って2段階で処理して $& も $1 も使わない形なんだろね。
588574:2006/07/16(日) 19:11:43 ID:pJTY6Rn5
レス遅くなってすみません。

>>577
一度別の変数に逃がしておいて、そっちの方で再度逆のパターンで取得する、
という理解で良いんでしょうか。参考にしてみます。
括弧でくくって逃がしておく方法は知らなかったので勉強になりました。

>>578
マッチ変数は1箇所でも使うと他の全ての正規表現にも影響が出るんですね。
今のところ使ってる箇所はないんで、できたら使わない方向で考えてみます。

>>580>>581
速度も気になりますが、「注意して使ってください」の文言に
ちょっとビビってしまいました。でも、他にも正規表現使ってる箇所があるので
できたらマッチ変数使わなくても良いのならそっちの方が良いと思っています。

>>583-584>>586
画に描いたようなツンデレと詳しいベンチマークありがとうございました。
局所的にはマッチ変数よりも$1使った方が処理は速いけれど
他にも正規表現使ってる箇所があれば、結果は逆になるということですね。
コード内で他にもいくつか正規表現使ってるところがあるので
マッチ変数を使わなくてはならない状況になれば$1を代用することにします。
非常に勉強になりました。

>>587
正規表現の置換と言えば即sでやってたので
trに特有の便利な修飾子があるのを見落としていました。
ずばりの解答も含めてありがとうございました。

レスくださった皆さん、ありがとうございました。
最近あちこちで落雷が発生しているみたいなのでパソコンの方もご自愛下さい。
589nobodyさん:2006/07/16(日) 19:42:51 ID:???
誰かアンチKENTの方々、コレが最高という掲示板配布サイトなどを教えて下さいな。
by KENT信者
590nobodyさん:2006/07/16(日) 19:44:18 ID:???
はいはい釣り釣り
591nobodyさん:2006/07/16(日) 22:04:02 ID:???
入力された文字を展開して表示させる方法ってあります?
たとえば ^\d$ と入力すると

0
1
2
3
4
5
6
7
8
9

と展開するみたいな
592nobodyさん:2006/07/16(日) 22:16:57 ID:???
ない
593nobodyさん:2006/07/16(日) 22:32:38 ID:???
質問の意図が読めない
正規表現の展開?
594591:2006/07/16(日) 22:41:09 ID:???
>>593
展開して表示する方法があるのかどうかです

^\d$なら>>591の通り0〜9まで展開
^[Aa]$ならAとaの2つ展開
という意味です



595nobodyさん:2006/07/16(日) 22:52:27 ID:???
[^a] とかの場合はどんな展開を想定してんだ?
できないってことでいいよ。
596nobodyさん:2006/07/16(日) 22:56:17 ID:???
知らないのかw


597nobodyさん:2006/07/16(日) 22:56:40 ID:???
残念ながら知らないw
>>592のいう通りじゃない?
簡単な正規表現だったら、頭の中で想像つくし、
複雑なものだったら、展開後の文字が何万行にも
わたってしまうから...

単純な例だと「/./」。
これの展開は 1byte で表されるものすべてだから、
多byte文字とか考えたらガクガクブルブルw
598593:2006/07/16(日) 22:59:52 ID:???
>>597>>591に対してのレス
599nobodyさん:2006/07/16(日) 23:01:02 ID:???
my $p = qr/^\d$/;
my @c = grep { $_ = chr($_); /$p/ } (0..0xFF);
600nobodyさん:2006/07/16(日) 23:34:52 ID:???
パソコンに入っているcsvファイルAを読み込んでデータを取り出して処理、
そしてサーバ上にあらかじめ用意してあるファイルBにその結果を書き出す、
ということをやりたいんですが、そういうことは可能でしょうか?
601nobodyさん:2006/07/16(日) 23:36:49 ID:???
>>600
要約するとこういうことです。

CSVファイルをアップロードして、処理した結果を保存する。

結論。可能
602600:2006/07/16(日) 23:42:33 ID:???
>>601
なるほど。とすると簡単な流れとしては
csvファイルAをサーバにアップロード
→オープンして処理
→ファイルBに書き込む
→ファイルA削除
という解釈で大丈夫でしょうか?
603nobodyさん:2006/07/16(日) 23:48:10 ID:???
no
604591:2006/07/17(月) 00:05:10 ID:???
>>599
ありがとうございます
605591:2006/07/17(月) 00:09:38 ID:???
>>602
もっといい方法があるかもしれないけど
csvファイルAからGrep→ファイルBに書き込む
でいけるような
606nobodyさん:2006/07/17(月) 00:19:41 ID:???
>>604
え、それでいいの?
シングルバイト、1文字限定なら、最初に言ってよ。
607nobodyさん:2006/07/17(月) 00:25:28 ID:???
>>602
search.cpan.org にいって
NET::FTP とか NET::SSH::PERL とか
そっちがわ系のモジュールを検討してみたら?
608nobodyさん:2006/07/17(月) 00:31:41 ID:???
>>606
ほんとだよなw
609600:2006/07/17(月) 00:46:22 ID:???
602の流れでとりあえず書いてみようと思ったんですが
ファイルAをアップロード→オープン
のところで、おそらくアップロードが完了する前に
オープンをかけてしまいエラーが出てしまいます。
アップロードとファイルBへの書き込み処理は
別々にしないと無理ですかね・・・。

>>603
喜び勇んで早速書き始めてたらいきなり否定されてたとは・・・

>>605
grepを使うにしても、まずはサーバ上にファイルAを上げないとダメですよね?

>>606
そういうモジュールがあるんですか。
調べてみます。
610nobodyさん:2006/07/17(月) 00:51:38 ID:???
>>609
そんなこたあないはず。
心配だったら sleep(1) でもしてみたらいいじゃない。
611591:2006/07/17(月) 00:59:20 ID:???
>>606>>608
ああああ、>>599はシングルバイト限定なんですね・・・
2バイト以上だとやっぱり無理?
612nobodyさん:2006/07/17(月) 01:06:13 ID:???
気づいてなかったのかw
613nobodyさん:2006/07/17(月) 01:06:32 ID:???
>>611
パターンなんて無限大にあるしなあ。
/.../ これだけ展開するので 255*255*255 だろw
もっと条件言うか何がしたいか言うかしないと 「無理」 って感じ。
614600:2006/07/17(月) 01:08:17 ID:???
>>610
単に処理のコードが間違ってるだけでした・・・
一応602の流れでやりたいことはできました。
615nobodyさん:2006/07/17(月) 01:09:20 ID:??? BE:566016588-#
                  般若波羅蜜多心経

           観自在菩薩行深般若波羅蜜多時照見五
           蘊皆空度一切苦厄舎利子色不異空空不
           異色色即是空空即是色受想行識亦復如
           是舎利子是諸法空相不生不滅不垢不浄
           不増不減是故空中無色無受想行識無眼
           耳鼻舌身意無色聲香味觸法無眼界乃至
           無意識界無無明亦無無明尽乃至無老死
           亦無老死尽無苦集滅道無智亦無得以無
           所得故菩提薩垂依般若波羅蜜多故心無
           罫礙無罫礙故無有恐怖遠離一切顛倒夢
           想究竟涅槃三世諸仏依般若波羅蜜多故
           得阿耨多羅三藐三菩提故知般若波羅蜜
           多是大神咒是大明咒是無上咒是無等等
           咒能除一切苦真実不虚故説般若波羅蜜
           多咒即説咒曰
           羯諦羯諦波羅羯諦波羅僧羯諦菩提薩婆訶

                 般若心経

仏説摩訶般若波羅蜜多心経観自在菩薩行深般若波羅蜜多時照見五蘊皆空度一
切苦厄舎利子色不異空空不異色色即是空空即是色受想行識亦復如是舎利子是
諸法空相不生不滅不垢不浄不増不減是故空中無色無受想行識無眼耳鼻舌身意
無色声香味触法無眼界乃至無意識界無無明亦無無明尽乃至無老死亦無老死尽
無苦集滅道無智亦無得以無所得故菩提薩捶依般若波羅蜜多故心無罫礙無罫礙
故無有恐怖遠離一切顛倒夢想究竟涅槃三世諸仏依般若波羅蜜多故得阿耨多羅
三貌三菩提故知般若波羅蜜多是大神呪是大明呪是無上呪是無等等呪能除一切
苦真実不虚故説般若波羅蜜多呪即説呪曰羯諦羯諦波羅羯諦波羅僧羯諦菩提薩
婆訶般若心経
616607:2006/07/17(月) 01:10:00 ID:???
>>609
適当にぐぐっただけなので、中身は知らんよ。
ただ、ftp, ssh 系のモジュールは、cpan に結構ある
から、その中に役立つものはあるかも。
617nobodyさん:2006/07/17(月) 01:11:22 ID:???
>>591
昔ム板のPerlスレで似たようなお題が出たのを思い出した。

Perlについての質問箱 21箱目
ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/478-
ミラー
ttp://makimo.to/2ch/pc8_tech/1134/1134327348.html#478

で、こんなのが紹介されている。
ttp://search.cpan.org/~bowmanbs/Regexp-Genex-0.06/lib/Regexp/Genex.pm
読んで試してみたらどうも\d等の文字クラスが含まれていると、
ランダムにしか出てこないみたいだけど参考まで。
618600:2006/07/17(月) 01:21:32 ID:???
>>616
FTPと似たようなことができるみたいなので
よく分からない状態で用いるのは、
セキュリティ上危険な気がしました。
ご忠告ありがとうございました。
619nobodyさん:2006/07/17(月) 05:25:24 ID:AcPhLonl
膨大なスクリプト内のいろんなところにexitが置いてあるコードはスパゲッティと考えていいですか?
620nobodyさん:2006/07/17(月) 06:08:57 ID:???
(´・ω・`)モキュ?
621nobodyさん:2006/07/17(月) 07:11:29 ID:???
>>619
mod_perlでも動かすのかな?
それより、local宣言だらけを心配した方がいいよ。
逆に、my宣言が全然ないとか。
622nobodyさん:2006/07/17(月) 10:19:25 ID:???
>>619
exitの飛び先は明確だし、フローがでたらめな訳でもないから、違う。
623nobodyさん:2006/07/17(月) 11:23:26 ID:???
>>618
> FTPと似たようなことができるみたいなので
> よく分からない状態で用いるのは、
> セキュリティ上危険な気がしました。

「FTPと似たようなこと」をやろうとしてるんじゃなかったのか。
にほんごってむずかしーね。
624nobodyさん:2006/07/17(月) 12:15:35 ID:???
それを実行するには「ftpと似たような事」をしなければ出来ないと
いう事に思い至らなかっただけでしょ。
625nobodyさん:2006/07/17(月) 14:29:03 ID:???
>>600
何悩んでるか知らないけど、アプロダ参考にすればいいんじゃないの?
626nobodyさん:2006/07/17(月) 16:03:52 ID:???
FTPつかわずに、どうやってアップロードしてるんだろう?
http?
627nobodyさん:2006/07/17(月) 16:31:38 ID:???
64**9を計算すると
1.8014398509482e+016
ってなるけど実数表示させるにはどうすりゃいいのん?
628nobodyさん:2006/07/17(月) 16:33:45 ID:???
>>627
5.8以上ならuse bigint;
それ以前を考慮するならMath::BigIntを直接使う
629nobodyさん:2006/07/17(月) 16:47:46 ID:???
>>628
おおそんなのがあったのか
ありがd
630nobodyさん:2006/07/17(月) 16:51:55 ID:???
>>628
スマソ、”Math::BigIntを直接使う”
直接使う?
631nobodyさん:2006/07/17(月) 17:13:50 ID:???
>>630
perldoc bigint を見れば分かるけど、
> "bigint" is just a thin wrapper around various modules of the Math::BigInt family.
632nobodyさん:2006/07/17(月) 22:48:16 ID:???
>>631
英語読めない
633nobodyさん:2006/07/17(月) 22:53:09 ID:???
"bigint"は Math::BigInt 関連のモジュールの単なる小さなラッパーです。
634nobodyさん:2006/07/17(月) 22:57:20 ID:???
>632
消防はもう寝な
635nobodyさん:2006/07/17(月) 23:00:55 ID:???
>>627
> 1.8014398509482e+016
実数表示してるじゃん。という突っ込みは誰もしないの?
636nobodyさん:2006/07/17(月) 23:01:54 ID:???
>>632
お前の次のセリフは 「ラッパーって何?」 だ
637nobodyさん:2006/07/17(月) 23:05:15 ID:???
>>636
ラッパーってあのラッパーですか?
638nobodyさん:2006/07/17(月) 23:21:32 ID:???
DAYONE
639nobodyさん:2006/07/17(月) 23:36:11 ID:???
>>628
5.8.8でuse bigint;したけど64**9は>>627みたいになったぞ?
640nobodyさん:2006/07/17(月) 23:43:04 ID:???
>perl -e "printf '%.0f', 64**9"
18014398509481984

こうですか? わかりません><
641nobodyさん:2006/07/17(月) 23:45:16 ID:???
printfでもできるのか
642nobodyさん:2006/07/18(火) 00:11:32 ID:???
>>639
user@localhost:~$ perl -Mbigint -e 'print 64**9, "\n"'
18014398509481984
user@localhost:~$ perl -v | grep v5
This is perl, v5.8.8 built for i486-linux-gnu-thread-multi
643nobodyさん:2006/07/18(火) 00:24:40 ID:DXYFSpfL
教えてください
このような表記は許されるのでしょうか?

1)$TEST[100]に代入されている文字列を表示させたい
2)$TEST[***]<-ここに$A[1]を入れたい

$A[1]=100;
$TEST[100]='TEST';
print $TEST[ $A[1] ];

やはり・・・
$A[1]=100;
$TEST[100]='TEST';
$B=$A[1];
print $TEST[$B];

なのかなあ
644nobodyさん:2006/07/18(火) 00:40:05 ID:???
>>643
>print $TEST[ $A[1] ];
全然これで構わない。何もおかしくない。
645643:2006/07/18(火) 00:46:23 ID:DXYFSpfL
644さん、ありがとうございます。

ソース記述が途中で間違っていたのかも知れなかったです。
この表記がまちがっていると思い込んで2時間位悩んでいましたm(_ _)m
646nobodyさん:2006/07/18(火) 00:52:26 ID:???
それより大文字の変数名やめないかw
647nobodyさん:2006/07/18(火) 01:00:06 ID:???
BASICを思い出す
648nobodyさん:2006/07/18(火) 02:34:41 ID:???
>639
5.8.4 だけど、use bigint で 18014398509481984 って結果でたよ

>643
大文字は定数で使われるのがほとんどなので、変数は小文字でどぞ。
649nobodyさん:2006/07/18(火) 03:41:25 ID:???
すいませんアドバイスおねがいします

1.(2/3)*(2/3) の解を 4/9 にするにはどうすればいいですか?
2.次に1.の解を 1/2.25 (分子を1)にするにはどうすればよいですか?
650nobodyさん:2006/07/18(火) 03:50:18 ID:RAKThs0C
CGIでクッキーかきました。保存されてるのを確認したのですが、
$ENV{'HTTP_COOKIE'}で何も取得できません!
作成直後ではなくて、ブラウザでリクエストを再送しても取得できません。
どんな原因が考えられましょうか!
651nobodyさん:2006/07/18(火) 04:54:13 ID:???
>>649
>>628と同様に、bigrat or Math::BigRatでどうよ。
2はライブラリ任せにしないで、算数的に出力時にdenominatorをnumeratorで割れば?
652nobodyさん:2006/07/18(火) 05:24:58 ID:???
>>649
use bigrat;
$a = (2/3)*(7/57);
print $a,"\n";
printf( "1/%f",1/$a);

%fのところはうまくいじらないと思い通りの出力にならないかも?
つーか7/8を1/xと表示したいときxは何になってほしいのか・・・?
653nobodyさん:2006/07/18(火) 05:35:52 ID:???
>>650
$ENV{'HTTP_COOKIE'}で何も取得できなくて、
いったい何で”保存されてるのを確認した”のか、教えてください。
パッと思いつく原因としてはクッキーを出してるスクリプト
と受け取ってるスクリプトがあるディレクトリが別になってるとか?
どうやってクッキーを発行して、どうやって受け取ろうとしてるのか、
もっと詳細に報告してください。
654650:2006/07/18(火) 09:21:50 ID:???
どうもです!確認はクッキーフォルダにクッキーファイルができたことを確認しました。
スクリプトはいっしょで、読み書きするスクリプトをリロードして確認したり、
読みと書きでパラメータを分けて行き来したりしています。
Set-Cookie: session=test;expires=;\n
と書いてます。index.cgi?a=1で書いてindex.cgi?a=2で読んでいます。

宜しくお願いします!
655nobodyさん:2006/07/18(火) 09:28:15 ID:???
アドバイスよろしくお願いします。

現在作ってるスクリプトで設定内容などは
$config = {
'test' => "テスト"
}
sub get{
my $pkg = shift;
my $hash = $config;
bless $config, $pkg;
}
my($cfg) = config->get();
print $cfg->{test};
この用にして設定内容を取得してます。
そして今回、$config の中に配列へのリファレンスを含めるようになり

@urls = (ずらずら〜っと);

と URL が書かれた配列へのリファレンスを

$config = {
'urls' => \@urls,
}

として $config へ設定しました。
この際に $cfg で値を取得する書き方としては

@{$cfg->{'urls'}}

で正解なのでしょうか?
もっときれいな書き方や 「こっちのほうが解釈としては正解じゃね?」 みたいな
書き方があれば教えていただければ幸いです。
656nobodyさん:2006/07/18(火) 10:10:41 ID:???
>>655
おk
657nobodyさん:2006/07/18(火) 10:19:23 ID:???
なんで設定をオブジェクトにしてるのか不明だけど、書き方はおk
658nobodyさん:2006/07/18(火) 10:26:39 ID:???
設定したつもりの値が得られるという意味では正しいかもしれないが、
perlのoopの使い方がどうみてもむちゃくちゃなので勉強しなおしてください。
変な癖をつけると後で苦労するよ。
659nobodyさん:2006/07/18(火) 10:32:26 ID:???
>>655
OOPをやりたいなら
package Config;
sub get{
my $pkg = shift;
my $hash = shift;
bless $hash, $pkg;
}
.....(いろんなメソッド)
package main;
my $cfg = Config->get({'urls'=>\@urls})

そのままだと、sub getが意味ない

>>658
perl oopのいい入門て見たことない希ガス・・・
660nobodyさん:2006/07/18(火) 10:35:44 ID:???
レスありがとです
この書きかたでいこうかと思います


>657
以前このスレだかどこかで KENT の様に設定用変数を数多く
用意するのは綺麗じゃないみたいなことがあったときに、
私が
config.pl
%config=('test'=>2);
sub getconfig{return %config;}

my %config=&getconfig();


ってやってるって書いたら効率悪いって言われたもんで、
ちょっと書き直してたらこうなった次第です。
661nobodyさん:2006/07/18(火) 10:35:45 ID:???
その get() が、実は new() な所がちょっと…
662nobodyさん:2006/07/18(火) 10:43:45 ID:???
ローカルにハッシュをコピってから参照するほうが、その都度
関数コールするよりもオーバーヘッドは少ないかなって思ったので。

数回から数十回のコールでオーバーヘッドを気にするのは無駄
とは分かってはいたんですがやっぱりスマートな書きかたではなかったですか(-_-;
663nobodyさん:2006/07/18(火) 10:46:41 ID:???
やっぱ慣例に沿った(newしてからget)方が、自分以外が読む人のためになりますか?
664nobodyさん:2006/07/18(火) 10:52:28 ID:???
>>650
print "content-type: text/html\n";
print "Set-Cookie: session=test\n";
print "\n";
print $ENV{HTTP_COOKIE};
とりあえずうちの環境だと、これを2回読み込むと画面にsession=test
と出るので、それでだめだったら環境がおかしい
665nobodyさん:2006/07/18(火) 12:38:15 ID:???
できました!ありがとうございます。
Set-cookie:〜\nContent-type:〜\n\nってなってたのをクッキーとContent-typeの順番を入れ替えただけで
行けたっぽいです。書き込み時がおかしかったようです。
ネットで順番はどっちでもいいようなことを見たし、実際クッキーらしきものが書かれていたのでこれでいいのかと
思ってました。ざっと試しただけですが、これから詳しいことを検証したいと思います。
あと、バグ入りクッキーは本当にクライアント環境によって挙動が違いました。(会社では場合によって読めた)
666nobodyさん:2006/07/18(火) 13:25:28 ID:???
Content-type:〜\n\nSet-cookie:〜\n
となっていたに1票
667nobodyさん:2006/07/18(火) 14:04:40 ID:???
>>663
ていうか、ただのハッシュとして使うだけなら
なんでオブジェクトにするのか全く不明。
それなら単純にハッシュを宣言して、読み込むだけの方が良い。
668nobodyさん:2006/07/18(火) 14:22:23 ID:???
>>665
順番はどうでもいいけど検証するなら空行が何を表すのかってことを検証して下さい。
669nobodyさん:2006/07/18(火) 14:43:02 ID:???
空行位置は665に書いたとおりなんで、間違ってないと思うんですよ。
それでも、やはり順序不問ってことは、どっかでケアレスミスしたかもしれません。今夜再検証してみます。
670nobodyさん:2006/07/18(火) 15:15:34 ID:???
>667
外部ファイルにhashで設定を書いてrequireすると、
同じ内容の変数が2つ存在することになって無駄があるので
オブジェクトにした次第です。
671nobodyさん:2006/07/18(火) 15:24:45 ID:???
>>670
その考え方が間違ってる。そんなことでオブジェクトにしちゃいけない。
だったらまだ、>>660 にある最初の書き方の方が、考えがマトモ。

同じ内容の変数が2つになるのが嫌なら、
外部ファイルの変数を別のハッシュに代入せずに、そのまま使えば良いだけの事。
672nobodyさん:2006/07/18(火) 15:28:41 ID:???
ifで(unlessを使わずに)「特定の文字列にマッチしなければ」という条件式を
書くにはどうしたら良いんでしょうか?
単純に
if($data !=~ /MOJI/)
という書き方では反映されないみたいなんですが。
673nobodyさん:2006/07/18(火) 15:31:12 ID:???
!~
674nobodyさん:2006/07/18(火) 15:31:47 ID:S5V5gxsh
比較の質問なんですが
「○○かつ△△」を文字列で扱う方法はやはりないのでしょうか?

$type1 = 'BAKA';
$type2 = 'KASU';
if ( $type1 eq 'BAKA' and $type2 eq 'KASU')

みたいにするには数値をそれぞれ代入してからやるべきなのでしょうか?
675nobodyさん:2006/07/18(火) 15:34:06 ID:???
>>670
リファレンスを使えば二重にならない。
676nobodyさん:2006/07/18(火) 15:38:45 ID:???
質問の意味が分からない
677672:2006/07/18(火) 15:39:57 ID:???
>>673
if($data =!~ /MOJI/)
と書いてみましたがエラーが出て動かないです。
どこが間違っているんでしょうか?

>>674
単純に
if ( ( $type1 eq 'BAKA' ) && ( $type2 eq 'KASU' ) )
で良いじゃないでしょうか。
678nobodyさん:2006/07/18(火) 15:42:18 ID:???
if ($data !~ /MOJI/)
679672:2006/07/18(火) 15:46:52 ID:???
>>678
できました。
=とか!とかはあくまでチルダに対して付いてたんですね。
ありがとうございました。
680nobodyさん:2006/07/18(火) 15:47:11 ID:S5V5gxsh
>>676
数値比較では && や and を使えますが
文字列でも同じように && や and を使っていいのかどうかということです
681nobodyさん:2006/07/18(火) 15:47:29 ID:???
Perlの本て、読まないのかな。
最近の質問見てるとネットだけで独学の人が多いような気がする。
682nobodyさん:2006/07/18(火) 15:48:55 ID:???
>>680
and や && は比較の内容と関係ない。
だから当然使って良い。
683nobodyさん:2006/07/18(火) 15:49:31 ID:S5V5gxsh
>>677
どうもです

>>682
ありがとうございます
684nobodyさん:2006/07/18(火) 16:01:37 ID:???
perldocの存在を知らない気がする
685nobodyさん:2006/07/18(火) 17:42:03 ID:???
>675
その都度デリファレンスするのって、見た目が余り綺麗じゃないからその案は
以前考えてるときに却下しました。
686nobodyさん:2006/07/18(火) 17:51:43 ID:???
>>685
誰がデリファレンスしろと…。

>>675 が言ってるのは、
外部ファイルで %config を定義して、return ¥%config; でリファレンスを返せば
同じハッシュが2つにならないということでしょう。
使う時は $cfg->{'hoge'} みたいなので良いんだし。デリファレンス要らない。
687nobodyさん:2006/07/18(火) 18:24:24 ID:???
OOP考えるならさあ、、
「とりあえず外部PL(PM)ファイルに設定をずらずらして require」 じゃなくて、
普通の(TXT)ファイルとかにCSVとかTSVみたいな感じで設定を書いて、
my $cfg1 = Config->new('config1.txt');
my $cfg2 = Config->new('config2.txt');
みたいな感じで設定取ってくるもんじゃないの?
>>655みたいに値を得たいときは my @url = $cfg1->get('url'); とかしてさ。
そうじゃないならOOPの意味もないな、って思うんだけどw
688nobodyさん:2006/07/18(火) 18:29:25 ID:???
AppConfigかConfig::*の中から適当なの見繕って使うのが普通じゃないかと。
689nobodyさん:2006/07/18(火) 18:54:51 ID:9xyhckKL
訪問者に強制的に話しかけるウェブサイト作ったのですが、
ページの更新をムダに頻繁にするのはいやなので30秒設定にしています。
要はチャットなのですが。

試験的に稼動してるのですが、相手にメッセージが届く前に相手が帰ってしまうようです。
そこで思ったのですが、こちらが書き込みをしたら即座に相手のブラウザに更新命令を
出すといったようなことはPerlCGIでは実現できませんでしょうか?

そんなことできたら怖すぎるかな?とも思いましたがやはりそんな危ない技術は正攻法では不可能ですかね?
ハッキング状態になっちゃいます?

アドバイスお願いします。
690nobodyさん:2006/07/18(火) 19:08:59 ID:???
>>689
そういうクライアントサイドなのはJavaScript(Ajax)とかでやるんじゃねーかなー。
691nobodyさん:2006/07/18(火) 19:18:16 ID:???
>>689
>こちらが書き込みをしたら即座に相手のブラウザに更新命令を
>出すといったようなことはPerlCGIでは実現できませんでしょうか?
できるわけないだろ。
そんな凶悪なセキュリティホールが空いてたらすぐに緊急のパッチが出るわ。

要は、最初のアクセスのときだけ3秒ぐらいでリロードして
その自動メッセージとやらを表示させて、
2回目以降は通常の30秒リロードにすれば良いんじゃないの?
692nobodyさん:2006/07/18(火) 19:45:12 ID:???
コネクション切らずにつなぎっぱなしで垂れ流せばよい。
共有サーバでやるとヌッ殺される。
693nobodyさん:2006/07/18(火) 19:45:35 ID:???
>686
あぁなるほど。
ファイルの最後で1;ってやるところで返すのはやらないほうがいいですか?
(出来るかどうか知らないけど)

>687
iniファイルのような設定ファイルは記述ミスに対するコーディングが生じるので考えてませんでした


勉強も兼ねて初めてパッケージ(もどき)を考えてみたけど、使いどころとか、使い方とか難しいですね
694nobodyさん:2006/07/18(火) 19:49:14 ID:???
>>687
つーか値を得たいときは$self->{'config'}->{'value'}
もしくは$selfをconfig hashそのものにして、$self->{'value'}。
そもそも関数で値を”とってくる”という発想自体が間違ってる。(OOPなら
695nobodyさん:2006/07/18(火) 19:52:09 ID:qN74jZ6A
my $count = $db->prepare("select count(*) from hoge where hogehoge = 1");
print $count;
-------------------------------
↑のような構文を打ったところ
(SQLで返される数字が出力されるようにしたつもり)
print $countが↓のように出力されてしまいます。
-------------------------------
DBI::st=HASH(1234abcd)
-------------------------------
正しく数字が返されるようにするにはどのようにしたらよいでしょうか?
696nobodyさん:2006/07/18(火) 19:55:35 ID:???
まず中学に入学して prepare の意味を調べられるようになれ。
697nobodyさん:2006/07/18(火) 19:59:59 ID:???
>>694
use CGI; で $Q->param('hoge') とかやるのは間違ってるってことニカ?
698nobodyさん:2006/07/18(火) 20:04:32 ID:???
気付いても、生暖かく見守るのが大人の対応だ
699nobodyさん:2006/07/18(火) 20:04:40 ID:???
>>697
それは”とってくる”じゃ無いと言いたいのだと思ふ。
関数じゃなくてメソッドだし。
700nobodyさん:2006/07/18(火) 20:06:25 ID:???
関数とメソッドの違いも答えられないくせに偉そうだにゅ
701nobodyさん:2006/07/18(火) 20:10:22 ID:???
googleで調べるの禁止な
702695:2006/07/18(火) 20:11:15 ID:qN74jZ6A
すいません抜けがありました。もう一度投稿ですみません。。


my $count = $db->prepare("select count(*) from hoge where hogehoge = 1");
$count->execute;
print $count;
-------------------------------
↑のような構文を打ったところ
(SQLで返される数字が出力されるようにしたつもり)
print $countが↓のように出力されてしまいます。
-------------------------------
DBI::st=HASH(1234abcd)
-------------------------------
正しく数字が返されるようにするにはどのようにしたらよいでしょうか?
703nobodyさん:2006/07/18(火) 20:13:37 ID:???
DBIモジュールの説明読んで。
704nobodyさん:2006/07/18(火) 20:15:42 ID:???
fetchしろ。fetchナントカってのはいっぱいあるからどれを使うかはお好みで。

705695:2006/07/18(火) 20:32:22 ID:qN74jZ6A
>>703-704
ありがとう
706nobodyさん:2006/07/19(水) 00:26:20 ID:aJ2dkknB

$a = 31536001
に対して年$year 月$manth 日$day 時$hour 分$minute 秒$second
を求めるには地道に

$year = $a - 3153600;

とした方がいいのでしょうか?
それとももっと簡単な方法がありますか?
よろしくお願いします
707nobodyさん:2006/07/19(水) 00:32:18 ID:???
誰か翻訳してくれw
708706:2006/07/19(水) 00:35:08 ID:aJ2dkknB
>>707
あああ、すいません
ミスってました

31536001は31536001秒ということです
秒、(繰り上がるならそれぞれ)分、時間、日、月、年を求める方法があるのかどうかです

709nobodyさん:2006/07/19(水) 00:38:52 ID:???
うるう年じゃない年の一年の秒数が31536000、だな

>>708
日数までは良いとしてだ。
一月の長さは同じじゃないわけだが、そこのところどうやって計算する気よ
710nobodyさん:2006/07/19(水) 00:41:06 ID:???
ああ、わかったw
$a = 31536000; # ← 3600*24*365
で、$a = 86401 なら 暦とか関係なく 1日と1秒 って経過時間だしたいってことね。

じゃあ単に
my @dates = gmtime($a);
とかやればいいんじゃねのw
711706:2006/07/19(水) 01:03:53 ID:aJ2dkknB
>>709
年は365、日は30にするつもりです

>>710
そうです
ちょっと
my @dates = gmtime($a);
やってみます
712706:2006/07/19(水) 01:08:22 ID:aJ2dkknB
>>710
51101071500

になります
713706:2006/07/19(水) 01:25:12 ID:aJ2dkknB
ああああ、すいません、ボケてました
ちゃんと>>711でできました

ただ気になるのがある時点での時間を求めるので
月の表示がうまくいきません

$a = 61;
の場合は1分と1秒なのでそのまま0月カウントになりおkなんですが
11月の次が12月を飛んでしまいます
かといって$mon+1;をすると$a=61;のときに1月1分1秒になっていまいます
これは仕様でしょうか?
714nobodyさん:2006/07/19(水) 01:51:28 ID:???
ある時間を起点にして「11ヶ月31日59分59秒後」の1秒後は「1年0ヶ月0日0分0日後」

まず小学校まともに卒業してカレンダーと時計の見方を身につけろよ。
715nobodyさん:2006/07/19(水) 02:04:47 ID:???
>>713
$mon は "11月" じゃなくて "11ヶ月目" なんだろ? +1する必要なんてない。
まあ $day を -1 してる (らしい) のはよかったと思うよw
716706:2006/07/19(水) 02:12:29 ID:aJ2dkknB
>>714
なんかおかしいな〜と思ってずっとカレンダー見てました
ようやく謎が解けましたw
ありがとうございます

ただ>>711のようにすると100年を超えると解がヌルになるようです

$a = 31536000000;
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($a);
$year = $year-70;
$mday = $mday-1;
print $year."年".$mon."月".$mday."日".$hour."時".$min."分".$sec."秒";

ヌルにしないためにはどうすればいいっすか?
717nobodyさん:2006/07/19(水) 02:19:09 ID:WORWfBlM
CGI::Liteを使ってFormからファイルをアップロードするCGIを作っています。
この際、ファイル名にタイムスタンプがついて1153238735__photo.jpgというようになりますが、
この「__photo」の部分を取って「1153238735.jpg」にする方法は無いでしょうか?
Content-dispositionのヘッダを使えばいいらしいですが具体的な方法が解りません。
よろしくお願いします。
718nobodyさん:2006/07/19(水) 02:20:38 ID:???
>>716
▽2038年問題
http://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95%8F%E9%A1%8C

まあ、そんな気になるなら一定の年数分の時間を最初に引いておけば?
719nobodyさん:2006/07/19(水) 02:25:04 ID:???
>>717
rename すればw
720706:2006/07/19(水) 02:33:21 ID:aJ2dkknB
>>718
わかりました
721nobodyさん:2006/07/19(水) 13:05:06 ID:???
コーディングではないのですが、
SSIをmod-perlで動かすにはどうしたらいいんでしょう?
CGIからmod-perl移行時にindexページはindex.html(SSI)からindex.cgiになるように設定したんですが、
GoogleのページランクとかもあるのでSSIを使いたいんですが、、
mod-perlに移行したらSSIが全く効いていないんです(-o-;
呼び出すperlがindex.plだとしたら、それ単体では問題なく実行されるんですが。。
722nobodyさん:2006/07/19(水) 13:13:26 ID:???
723nobodyさん:2006/07/19(水) 13:57:04 ID:???
>>722
さんくすこ
724nobodyさん:2006/07/19(水) 19:58:46 ID:???
>>716
gmtimeとかって普通に現在時刻+αぐらいを扱うためのものだから、
100ねんとか、それ以上のことやろうとしてるんだったら、
自分でなんか作ったほうがいいと思う・・・
725nobodyさん:2006/07/19(水) 20:00:25 ID:???
つ DateTime::Calc
726nobodyさん:2006/07/19(水) 20:03:34 ID:+wpVYCo5
perlCGIでIEとIE以外のブラウザで条件分岐をして別のHTMLを渡したいです。
$ENV{"HTTP_USER_AGENT"}
この中の文字列を正規表現とか掛ければいいのでしょうか?

$ENV{"HTTP_USER_AGENT"} =~ /internet explorer/i;

で大丈夫でしょうか?自分はIE6ですので他のバージョン確認できませんので宜しくお願いします
727726:2006/07/19(水) 20:05:37 ID:+wpVYCo5
まちがえました。

$ENV{"HTTP_USER_AGENT"} =~ /IE/;

これでいいのでしょうか?ちなみにOSは虫です。
728nobodyさん:2006/07/19(水) 20:17:07 ID:???
>>726
自分のPCなら火狐とかモジラとかオペラとかインストールして
実験すれば?
あとは、自分のページの中で一番アクセスのあるページでユーザエージェントを記録して、
どういうブラウザのアクセスがあるか観察して判断
729571:2006/07/19(水) 20:40:38 ID:+wpVYCo5
>>728
この雰囲気からすると、そんな簡単なIEとそれ以外の判別方法は存在しないということでしょうか。
確かに今後IEという文字が入るIE以外のブラウザが出る可能性もありまよもんね。

なかなか制作側には不便な環境なんですね。
レスありがとうございました。
もう少しだけ粘ってみます・
730nobodyさん:2006/07/19(水) 20:47:29 ID:???
"MSIE"が含まれてるならIEと判断しちゃっていいんじゃないかな
今のところ、User-Agentに"MSIE"が含まれる一般的なブラウザはIEだけ。
731571:2006/07/19(水) 20:48:27 ID:+wpVYCo5
http://www.futomi.com/lecture/env_var/http_user_agent.html

これで行こうと思います。
728さんもよければ参考にしてください。
それでは失礼します。
732571:2006/07/19(水) 20:50:23 ID:+wpVYCo5
>>730
どうやらOperaが危ないようです。

$ENV{"HTTP_USER_AGENT"} =~ /MSIE/ and $ENV{"HTTP_USER_AGENT"} !~ /Opera/;

これで90%程度はいけるのではないかと思いますが。
733nobodyさん:2006/07/19(水) 21:00:22 ID:PWLYocjq
-wって使ってみました。膨大な数の

Use of uninitialized value in substitution (s///)

というエラーが出ました。例えば下記の場合、@_が問題っぽいんですが、
どのように直したらいいでしょうか。

sub reformat_date {
my %args = (date => '', @_);
my $tmp = $args{'date'};
$tmp =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1-$2-$3 00:00:00/;
return $tmp;
}
734nobodyさん:2006/07/19(水) 21:04:25 ID:???
宣言しただけで値が格納されていない変数に対して値を読み込もうとしたからです。
735728:2006/07/19(水) 21:13:16 ID:???
>>731
なるほど、参考になりました(ぉ
736nobodyさん:2006/07/19(水) 21:21:25 ID:???
&reformat_date('20060719') ;
してるものと仮定して。
my %args = (date => $_[0] );

つかこれだけだったら、%args てまったくの無駄なんだけど…
で、入力は何?
737nobodyさん:2006/07/19(水) 21:22:42 ID:???
入力フォームからpostで次のページにデータを渡して移行した後、
ブラウザの「戻る」を押すと、入力フォームにデータが残ってる状態です。

二重のpostを防ぐために、postした後、戻るを押すと、
「ページの期限切れ〜」みたいな表示にする方法は無いんでしょうか?

738nobodyさん:2006/07/19(水) 21:23:48 ID:???
だけどサーバー側でブラウザ判断する必要があることってそんなあるのかな?
739nobodyさん:2006/07/19(水) 21:26:12 ID:???
>>737
その工程は二重投稿と言わないようなw
740733:2006/07/19(水) 21:34:01 ID:???
どうもです!入力は736のような感じです。名前付引数に統一した関係で、
こういうシンプルなのも%argsになってます。736さんのように変更してもだめでした。

ていうか、全く同じ関数をテスト用のシンプルなコードに書いたら
エラーがでませんでした。-wは呼び出し元との兼ね合いでもエラー出すんでしょうか。
741nobodyさん:2006/07/19(水) 21:36:59 ID:???
>>740
reformat_date( date => $hoge )
とかやってて、$hoge が未定義(undef) なんじゃないの?

$tmp =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1-$2-$3 00:00:00/ if (defined $tmp);
とかにしてみればどうよ
742733:2006/07/19(水) 21:37:48 ID:???
すいません、736さんので改善されてました!失礼しました。
743733:2006/07/19(水) 21:43:08 ID:???
741さんのおっしゃる通りでした!
呼び出し側が場合によって未定義のときがあったのが原因でした。
てっきり、字面だけでデバッグされているのかと勘違いしてましたので
呼び出し側をチェックしてませんでした。
ありがとうございました!
744nobodyさん:2006/07/19(水) 21:45:46 ID:???
>>738
なに言ってんだ?
「そんなある」「そんなない」
恐ろしくどうでもよくね?
745nobodyさん:2006/07/19(水) 22:22:19 ID:???
>>737
pragma no-cacheあたりで検索

まあ、そういう仕様の板が便利かどうかは微妙な気もするけど、
むしろ、パスワードで削除機能とかの方がエレガントなような・・・?(作るのはめんどくさいけど
746nobodyさん:2006/07/19(水) 23:49:53 ID:???
>>745
答えるなら最後まで答えてやれよ。
なんか見てて気持ち悪いわ。
747nobodyさん:2006/07/20(木) 00:14:49 ID:???
print "content-type:text/html\n";
print "pragma:no-cache\n\n";
とかこういうこと?それともパスワード機能の実装の仕方自体語れってこと?
後者だったら拒否w
748nobodyさん:2006/07/20(木) 00:42:07 ID:EXDq6RmQ
すみません、初心者の質問なんですが

sub main{
  local @tmp = ("aa","bb");
  print "$tmp[0]"."  "."$tmp[1]\n";
  &subroutine(\@tmp);
  print "$tmp[0]"."  "."$tmp[1]\n";
}

sub subroutine{
  local $tmp = @_[0];
  $tmp = ("cc","dd");####################################
  print "$tmp->[0]"."  "."$tmp->[1]\n";
}

というコードを書きました。
しかし#############の行でエラーになってしまいます。
要するにmainルーチンから@tmpのポインタを送ってサブルーチン側では@tmpに("cc","dd")を代入したいのです。

サブルーチンで
$tmp->[0] = "cc";
$tmp->[1] = "dd";
とやれば済むのですが、こうではなくて = ("cc","dd")という風に代入したいのです。(実際はsplitとかを使って代入するから)ポインタを使ってどういう風にしたらよいかわかりません。ご教授おねがいします。
749nobodyさん:2006/07/20(木) 00:48:05 ID:???
sub subroutine{
 @{ $_[0] } = ("cc", "dd");
}
こういう事?

他の部分に関してはつっこんだら負けかなと思っている
750748:2006/07/20(木) 00:50:00 ID:EXDq6RmQ
>>749
即レスありがとうございます。
そのようにやったらできました、ありがとうございました!
751nobodyさん:2006/07/20(木) 02:46:41 ID:???
>>749
超能力者か!?
752nobodyさん:2006/07/20(木) 03:30:07 ID:???
>>751
お前の考えてる事も全部まるっとお見通しだ! 「セクロスシテー」「カネホシー」「ハタラキタクネー」だろ!
753nobodyさん:2006/07/20(木) 08:26:39 ID:???
>>752
違うよ。
「あぁ。ねれねぇ。明日起きれるかな・・・・・」
だよん
754nobodyさん:2006/07/20(木) 09:22:01 ID:???
朝っぱらから明日の心配イクナイ
755nobodyさん:2006/07/20(木) 09:42:37 ID:???
while(@row){substr $_,0,-1} if $754 == 1
756nobodyさん:2006/07/20(木) 11:10:49 ID:OwGfxror
test.cgiとaccess.cgiがありまして。
test.cgiが呼ばれたときにtest.cgiの中で、まず初めにaccess.cgiを起動実行させてから
test.cgiの本処理に映りたいのですがさすがに無理でしょうか?

access.cgiはgif画像を一つ返してくるだけです。
757756:2006/07/20(木) 11:37:22 ID:OwGfxror
# ユーザ・エージェント オブジェクトを作成
use LWP::UserAgent;
my $ua = new LWP::UserAgent;
$ua->agent('AgentName/0.1'.$ua->agent);
# リクエストを作成
my $req = new HTTP::Request(POST => 'http://hoge.com/access.cgi');
$req->content_type('application/x-www-form-urlencoded');
$req->content("id=get");
# ユーザ・エージェントにリクエストを渡し、返されたレスポンスを取得
my $res = $ua->request($req);
# print $res->is_success;

昔作ったCGIから拾ってイジッテいちおうこれで呼び出しはできたのですが、
access.cgiに自分のとは違うIPが記録されてしまうようです。

アクセス管理CGIの都合上できればIPが別のものになってほしくないんです。
また、できればネット経由でない方法で呼び出せればと思ったのですが。
cron使用の呼び出しと同じような感じができて、さらにIPが自分のものか127.0.01とかなら最高なんですが。

どうぞ玄人の方お助け宜しくお願いします。
758nobodyさん:2006/07/20(木) 11:47:34 ID:???
hoge.comを勝手に使わないように。攻撃依頼で削除申請するか?
759nobodyさん:2006/07/20(木) 12:01:19 ID:WCdGbBzj
linux上のperlで書いたCGIから、majordomoの設定ファイル(majordomo.cf)にアクセスさせようとしています。
ところが、openでエラーになります。

majordomoのファイルが

オーナー:mail
グループ:deamon
属性:777

なのが原因だと思うのですが、このファイルを上記条件から書き換えるようにするには、cgiのプログラム
からどのようにしたら良いでしょうか?
760nobodyさん:2006/07/20(木) 12:12:22 ID:???
777で開けないなんて普通はないんだがな。openがエラーになってるとわかってるなら
$!の値も示せよ。
761756:2006/07/20(木) 12:13:08 ID:OwGfxror
誰もわかりませんでしょうかm(__)m
762nobodyさん:2006/07/20(木) 12:16:44 ID:???
>>758
その理屈ならYAHOOは死刑になっちゃいそうな勢いだな。
あんな有名なサイトが無許可で他人のサイトのアドレスを晒しまくって。
とりあえず削除申請してこいよ。
763756:2006/07/20(木) 12:24:17 ID:OwGfxror
>>762
荒れるから止めて欲しいのですm(__)m
私あてのレスです。
本人である私がスルーしてるのですから、察してくださいませんか。

宜しくお願いします。
764nobodyさん:2006/07/20(木) 12:35:40 ID:???
>>756
system('perl access.cgi');とか?
というか、そのaccess.cgiの返してくる画像は必要なんですか?
画像だけが、必要なら<img src="access.cgi">とか?
でも、そのくらい知ってそうっていう雰囲気ですよね・・・・・・・・
なんだろう・・・
765756:2006/07/20(木) 12:46:10 ID:OwGfxror
>>764
言葉足らずだったかもしれません。ごめんなさい。
access.cgiはアクセスログを取っていくcgiなんです。
test.cgiは今仮で作ってるアクセス解析cgiなんです。

test.cgiからaccess.cgiを呼びたいのは最新の情報を読みたいからなんです。
つまりaccess.cgi直後のaccess.logが一番精度が高いわけです。

秒単位で誰がどこにいるかを表示してますので意外と重要なのです。
ですからaccess.cgiからの戻り値はまるでいりません。
要はaccess.cgiに処理をさせればいいだけなんです。
それこそ最悪access.cgiの中身をtest.cgiに書いて解決です。あまりにひどい決着ですが。
返してくるgif画像自体はまるでいりません。

長文すみません。ご飯を食べてまいります。
766nobodyさん:2006/07/20(木) 13:09:01 ID:???
架空のドメインを例示するときは予約されているexample.comとかexample.jpにするべきだと思うよ。
767756:2006/07/20(木) 13:10:51 ID:OwGfxror
>>766
exampleですね。ありがとうございます。
以後そういたします。
768nobodyさん:2006/07/20(木) 13:13:04 ID:???
access.cgiの内容をモジュールにして両方から呼び出せるようにすりゃいい
その前になぜかむかつくんだがなんでだぜ?
769nobodyさん:2006/07/20(木) 13:20:02 ID:???
しかもh○ge.comって実運用されてるんだからさぁ。
770759:2006/07/20(木) 13:32:32 ID:WCdGbBzj
$! は Permission Denied です。

権限の問題だと思うのですが・・・どうすれば処理できるでしょうか?
771756:2006/07/20(木) 13:32:50 ID:OwGfxror
>>768
呼び出したいがためだけにaccess.cgiに手を加えるのは避けたかったです。
他のケースのときでも全部そうなってしまうのは愚の骨頂みたいに思ってましたが
その認識が間違ってるのですかね。

ちょっとガッカリです。
772nobodyさん:2006/07/20(木) 13:37:48 ID:???
requireじゃいけんの?
773nobodyさん:2006/07/20(木) 13:38:45 ID:???
>>770
ファイル自体が777なのでそれは問題ないと思うから経由するディレクトリだろうな。
どういう風にパス指定しているのかは知らないが関係するディレクトリを全部確認してみ。

774nobodyさん:2006/07/20(木) 13:40:32 ID:???
>>732
ちょい亀レスだがOpera10から完全にIEに偽装する機能が実装されてるよ
775nobodyさん:2006/07/20(木) 13:44:36 ID:???
>>774
へぇ。Operaは何がしたいんだろう・・・・
そもそも偽装するなよって話だよな。製作者への嫌がらせとしか思えない。
製作者協会とかあればなぁ。ふざけた実装を排除していけるのに。

>>768
まあまあ。今日はなかなかすごしやすい気温なんだからおっとりしようぜ
776nobodyさん:2006/07/20(木) 13:46:18 ID:???
>>775
逆にagent調べてIEじゃないってだけで門前払いなサイトもよくあるわけで、
どっちもどっちだね。
777nobodyさん:2006/07/20(木) 13:48:44 ID:???
なんか俺がガッカリされたみたいだ・・・(´・ω・`)
778756:2006/07/20(木) 13:55:49 ID:OwGfxror
>>777
いえ、それは勘違いですよ・・・(´・ω・`)
779nobodyさん:2006/07/20(木) 13:58:35 ID:???
XHTML+CSSで凝ったサイト作ろうと思ったことある奴なら
UAにIEを含んだらヤフにでも飛ばしたろとか思ったことあるはずだ
780nobodyさん:2006/07/20(木) 14:05:54 ID:???
>>776
違うよ。
>>779
ん?なんか変だぞ?
そもそも「XHTML+CSSで凝ったサイト作ろうと」ってのがどうなんだろうか。
XHTMLやCSSは目的を果たすための一つの手段に過ぎないというのに、
その手段を目的としてるということは、何かを伝えたいんじゃなくて、使いたいだけという可能性もあるな。
それこそIEの挙動なんて無視すればいいじゃない。使いたいだけなんだから。

なんちゃって。人間がそれほど単純なら苦労はないよね。
やっぱり制作協会ってのがあればいいと思うんだよな。
781nobodyさん:2006/07/20(木) 14:08:55 ID:???
なんか俺が勃起したみたいだ・・・(´・ω・`)
782nobodyさん:2006/07/20(木) 14:10:18 ID:???
>>765
access.logの内容はIPとかUAとか時刻とかがずらずら並んだ状態ですか?
もしそうだったら、別にいつ読み込んでも、新鮮とか新鮮じゃないとか
関係ない気がしますが・・・
それとも、なんか特殊な、フォーマットのデータがaccess.logには含まれてるんでしょうか?
783759:2006/07/20(木) 14:11:14 ID:WCdGbBzj
アクセスしようとしているのが、

/usr/local/majordomo/lists/ なので上位全ての777にするのは気がひけます。
listsだけは 777 にしみましたが、同じエラーでした。

linuxのfs設定で何かあるのでしょうかねぇ?
784756:2006/07/20(木) 14:14:40 ID:OwGfxror
>>782
ありがとうございます。
ずらずら並んだ状態です。
アクセス時刻ももちろん並んでおります。アクセス時刻が一定を過ぎると削除し
リアルタイムで誰がどこにいるかをある程度特定するアクセスプログラムになっております。

ですので新鮮さは重要なのです。
でももう最悪の方法で片付けてしまいました。せっかくご親切に気に掛けていただいたのにすみませんです。
access.cgiの一部をそのままコピペしましたtest.cgiにorz
785nobodyさん:2006/07/20(木) 14:18:25 ID:???
>>784
いや、まあ、それで正解だと思う・・・<貼り付け
そんな長くなさそうだし、
786nobodyさん:2006/07/20(木) 14:19:19 ID:???
コピペするぐらいならその時点でカプセル化しとけ
また同じこと繰り返すことになるぞ
787nobodyさん:2006/07/20(木) 17:29:45 ID:gqKAMnqO
どなたかお手すきの方いらっしゃいましたらお助けください

1)combbslog.cgiというファイルを一行読み込んで
$rl,$yl,$gl,$wl,$blにそれぞれの値を代入して
すべてが1より大きければ実行する。
プログラムを書いてみたつもりです。

ちなみにcombbslog.cgiの中身は


<>1<>3<>1<>1<>1<>

↑こんな感じです


2)open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
local(@file) = <IN>;
close(IN);
local($rl,$yl,$gl,$wl,$bl) = split(/<>/);

if(($rl > 1) && ($gl >1) && ($yl > 1) && ($wl > 1)){実行したい内容;}

3)とくにエラーなどは出ないのですが条件を満たしていても実行されません。

ファイルを読み込む当たりが良くわかっていないのでそのあたりがおかしいのではないかと思っています。
どこかおかしいところがありましたら教えてください。
788nobodyさん:2006/07/20(木) 17:38:15 ID:???
データファイルに*.cgiという拡張子をつけるのはおかしい。

とりあえず
print $rl,$yl,$gl,$wl,$bl;
してみろ
789nobodyさん:2006/07/20(木) 17:44:06 ID:???
>>787
if文の所。
>
の演算子の意味はわかってるよね?1には反応しないよそれじゃあ。2からだな
だからファイルの中身が全部2以上なら実行されるだろうね。
790nobodyさん:2006/07/20(木) 17:48:57 ID:???
>>787
$rlの値がいつも空になると思うよ。

split(/<>/) だと
$rl<>$yl<>$gl<>$wl<>$bl<> こうでしょ。

>>788
> データファイルに*.cgiという拡張子をつけるのはおかしい。
( ´_ゝ`)・・・

>>789
すべてが1より大きければ実行する。ってことだからいいんじゃないの
791789:2006/07/20(木) 17:53:54 ID:???
>>790
よっ!さすがだな、おまい
792787:2006/07/20(木) 18:00:12 ID:???
こんなにも早くレスがついてるとは思いませんでした。

とりあえず全部2以上にしてみて
あと$rl<>$yl<>$gl<>$wl<>$bl<>にしてみますね

793787:2006/07/20(木) 18:13:32 ID:gqKAMnqO
レス下さったかたがたありがとうございます。
上記のことをやってみましたが出来ませんでした・・・
ためしに
print $rl,$yl,$gl,$wl,$bl;
しても何も表示されなかったのでどこか他のところがおかしいのかな?

以下にプログラム全文載せますので、もしよろしかったらまたお願いします。


-selectcol.cgi-

#!/usr/bin/perl --

open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
local(@file) = <IN>;
close(IN);

local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);

print $rl,$yl,$gl,$wl,$bl;

__END__

-combbslog.cgi-

1<>2006/07/20(Thu) 00:06<>blackh.gif<><><>北朝鮮がミサイルを発射することで国際社会からより疎外されている<><>127.0.0.1<><>1153321603<>2<>2<>2<>2<>2<>

794nobodyさん:2006/07/20(木) 18:17:11 ID:???
>>788
  .r‐――'i   / > _         ,ノ~';;.    .....,,、 l´゙|゛           |´゙l゙        ,,,,,,,...... --、,
  . ̄ ゙̄} |  / ./ .;;./ '、         / ,./      ,! ./____| |__________、  ,,............-! !ー'''"゙.l     .ヽ --‐= /
  .r‐―" |'l゙_,,, ̄'i --、'ッ    / /      ./ ...........、 ,,................,!   ゙‐'ー''''''''''、 '.l゙´_,,,, 、      /./
  l |゙゙゙゙"'".._.... ! .|........ニ   / /       / /   ||       .l'''''''''''''''''''_.゛,,.... --′   ./ .イ-―ー 、
  ! .―--ィ .! .r‐''i .r‐‐i !  ..l ヽ.       ゙'/l'''''''''''''′゙'''''''''''''''i   `゙゙゙゙゙゙´゙_,゙,゙,,,,゙;;..\,    ./ ,..-''''^゙゙゙゙゙''''、 ヽ
  .゙‐'"^゙| ! .| .゙‐'''" !―" |    \ .\.       `゙゙゙゙゙゙゙゙゙| .!゙゙゙゙゙゙゙゙゙´    ,r'",, ---- ..,,/   < /        .| |
     .| ! .゙‐'゙゙゙゙゙! .!゙゙.l゙'│     .\. ゙'-,            ,! !        ! l゙              ゛       ._./ ./
  .,,,,,,,ノ !.r‐―ー" ゙''二、ヽ      .\ .゙>  .!^^^^^^^^^゛ `^^^^^^^^.!  .\`'''''''''''''''''''''>       'l'''''''''^゙゙_,,..-'゛
  .ゝ--‐゛ ゙‐''"゙ ̄´゛  `'´        `   . ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄゛    `゙゙''''''''''''''''"         ̄ ̄゛
795nobodyさん:2006/07/20(木) 18:19:15 ID:???
この場合
local(@file) = <IN>;
ぢゃなくて
@_ = <IN>;
なら動くんで内科医?
796nobodyさん:2006/07/20(木) 18:19:15 ID:???
良い悪いは別にしてデータファイルに*.cgiという拡張子をつけるのはおかしいだろw
あえてソコだったんだがただのかわいそうな人になってしまったw
797nobodyさん:2006/07/20(木) 18:20:27 ID:???
>>796
おかしくないよ
他人に見せないためにも*.cgiにしたほうがいいと思うよ。
798787:2006/07/20(木) 18:25:43 ID:gqKAMnqO
またしても即答ありがとうございます。
>>795さんのいうとおりにしたら
error500

CGIエラー-Content-Typeヘッダが正しくありません。

とでてしまいました。これはどういうことでしょうか?
799nobodyさん:2006/07/20(木) 18:25:51 ID:???
>データファイルに*.cgiという拡張子を付けることがおかしいだろw
おかしいと思う理由が知りたいんだが
800nobodyさん:2006/07/20(木) 18:27:34 ID:???
combbslog.cgiのパーミッションは適切か確認汁
801nobodyさん:2006/07/20(木) 18:29:28 ID:???
CommonGatewayInterfaceなファイルではないからおかしいという理論
っつーかもう触れないでくれw
どおりで俺の冗談には誰も笑わないわけだ
802nobodyさん:2006/07/20(木) 18:32:24 ID:???
>>801
冗談にして逃げるわけねw
803nobodyさん:2006/07/20(木) 18:32:45 ID:???
> local(@file) = <IN>;
> close(IN);

> local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);

$_ に何入ってんだよwww

foreach (@file) {
local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);
・・・
}

こうしたいんじゃねえのかい?
804nobodyさん:2006/07/20(木) 18:33:56 ID:???
ああん更新し忘れた(ノ∀`)ペチ
805nobodyさん:2006/07/20(木) 18:34:18 ID:???
>>798
print "Content-type: text/html\n\n";
を出力の前に入れないと駄目でしょ。

それと>>793が全文だとすると、sub error はいずこへ
806nobodyさん:2006/07/20(木) 18:35:10 ID:???
>>802
逃げさせてくださいw
807nobodyさん:2006/07/20(木) 18:35:31 ID:???
>>798
ブラウザでやってんの?

なら
つ【print "Content-type: text/html;\n\n"】
808nobodyさん:2006/07/20(木) 18:39:50 ID:??? BE:318384566-#
突っ込み所が多すぎて
809787:2006/07/20(木) 18:41:17 ID:gqKAMnqO
はい、ブラウザでやってます。AN HTTPD というソフトでローカルチェックしてるところですから
パーミッションの設定はまだ関係ないですよね。
810787:2006/07/20(木) 18:44:23 ID:gqKAMnqO
突っ込みどころ多くて申し訳ないです。

>>803さんや>>805さんのとおりにしてみたらエラーは出なくなりました。
ただ何も出力されてきません。
811nobodyさん:2006/07/20(木) 18:48:34 ID:???
デバック方法は自分で考えなよw

とりあえず
open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
print <IN>;
close(IN);

とかからやってみたら。
あと無意味に local 使ってるのが kentくさくてイヤ。
812787:2006/07/20(木) 18:51:54 ID:???
>>811さん
  はい、デバックは自分で頑張ってみますね。
Kentさんのところをすごく参考にしていたのでそうなってしまいました。
813787:2006/07/20(木) 18:55:45 ID:gqKAMnqO
はやくもまた質問で申し訳ないのですが
ファイルを読み込むとき
最初の一行だけを読み込むとか出来ますか?
814789:2006/07/20(木) 18:57:06 ID:???
今日はみんな親切だな。
まあ雨がひどいからな。

815nobodyさん:2006/07/20(木) 18:58:03 ID:???
open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
$data = <IN>;
close(IN);
816nobodyさん:2006/07/20(木) 19:00:43 ID:???
親切だなw

もう俺なら 「どこの講座でもいいから一回全部読んで来い」 っていう。 >>576 のでもいいから。
817787:2006/07/20(木) 19:02:37 ID:???
ほんとうに親切にありがとうございます。
雨の日でよかったです。
818787:2006/07/20(木) 19:18:46 ID:???
望んでいた事が出来ました!!
本当にありがとうございました。
花火大会を中止に追い込んだにっくき雨でしたが、
いまでは感謝しています
819nobodyさん:2006/07/20(木) 19:47:26 ID:???
とかいって、回答者の実に半数は晴れでも出かける予定はなかったり・・・
820nobodyさん:2006/07/20(木) 19:56:23 ID:???
ここまで話がはずんだのは>>788のおかげだとオモ
821nobodyさん:2006/07/20(木) 20:18:14 ID:???
照れるじゃまいか
822nobodyさん:2006/07/20(木) 23:14:01 ID:???
しかしあれだよな。
IE7って最高だな。
823nobodyさん:2006/07/20(木) 23:25:57 ID:???
Acid2もクリアできないブラウザは嫌いだ
824nobodyさん:2006/07/20(木) 23:27:54 ID:???
Perl7もたぶん最高
825nobodyさん:2006/07/20(木) 23:55:28 ID:???
実装も存在しない言語は嫌いだ
826nobodyさん:2006/07/21(金) 01:52:13 ID:VvqLR3Fu
コードの中で、自分自身が書かれている行数(行位置)を知ることはできるでしょうか。
例えば、「この文字列はindex.cgiの563行目で出力されました」と動的に出力できますか?
827nobodyさん:2006/07/21(金) 01:53:59 ID:???
print __LINE__, "\n";
828nobodyさん:2006/07/21(金) 01:56:42 ID:???

1: 自分は明日休みで暇だから・・・
2: なんかおまいらにコーディングの問題でも出して・・・
3: みようかな・・・

問題
・DATログをGrepして表示する
・検索語は任意の文字
・表示方法は100個づつ

最速コーディング達成者には妹の入浴画像を賞品(ry
829nobodyさん:2006/07/21(金) 02:00:29 ID:???
>>827
おお!感動しました。そんな簡単にできたんですね。
エラー処理関数内でdieしたらデバッグの役に立たない行数がログに残るので
その対策をと考えておりました。ありがとうございます!
830nobodyさん:2006/07/21(金) 02:16:23 ID:???
>>829
そういうことなら最後に改行を付けなさい。それで消えるから。
831830:2006/07/21(金) 02:20:35 ID:???
あ、ごめん。なんか凄い勘違いしたきがする。
呼び出し元の行をログに書きたいならcaller関数をあたると良い。後Carpモジュールも
832nobodyさん:2006/07/21(金) 02:24:01 ID:???
あ、すみません、分かりづらくて。
丁度、callerを発見して感動して、その報告をしに来たところでした。
ありがとうございます!
833nobodyさん:2006/07/21(金) 03:50:54 ID:???
ちょっと感動しすぎだろ
834nobodyさん:2006/07/21(金) 10:04:09 ID:???
今日も雨だな・・・・
注文こねえかな
835nobodyさん:2006/07/21(金) 10:25:40 ID:???
1.list.txtというファイルを読んで、一行ずつチェックボックスにするcgiを作ろうと思いました。
チェックされた項目は別ファイルに時刻付きで書き出すつもりでした。
2. ttp://marco.s4.xrea.com/cgi-bin/check/check.cgi
 を元にいろいろ変えて見てます。
3.入力フォームからpostでデータを渡して、表示上はどのチェックボックスもオンではないのに、
ブラウザをリロードすると、前にチェックされたデータが再度チェックされてます。
これは、どうしてでしょうか?
初心者で、不具合をうまく言えなくてごめんなさい。またこちらでの書き込みが不適切でしたら、該当スレをご教示いただければ有りがたく存じます。

下記は、ソースの一部分です。
print "<form action=$script method=post>\n";
print "<tr><td bgcolor=$page_color><font color=$bg_color>Check</font></td>\n";
print "<td bgcolor=$page_color><font color=$bg_color>項目</font></td></tr>\n";
open(LST,"$listfile");
@LIST=<LST>;
close(LST);
$cnt=0;
foreach (@LIST){
chomp($_); #chomp 行末の改行を削除
$cnt++;
print "<tr><td><input type=checkbox name=chk$cnt value=1";
print "></td><td><b>$_</b></td></tr>\n";
}
print "</table>\n";
print "<input type=hidden name=checkcnt value=$cnt>\n";
print "<input type=submit value=送信>\n";
print "</form>\n";
 
836nobodyさん:2006/07/21(金) 10:31:20 ID:???
837nobodyさん:2006/07/21(金) 10:43:47 ID:???
>>828
すまんが問題の意図が掴めん。

そして妹の入浴姿より姉の下着姿のほうがやる気が出る。
838nobodyさん:2006/07/21(金) 12:09:34 ID:NKhAgGvd
本当にくだらないことで申し訳ないのですが、
入力されたURLが正しいURLかを判断するソースはどのようになるのでしょうか?
メールアドレスを判断するスクリプトは何とか分かるのですが、
URLとなると・・・どのようにしたらよいか・・・・
839nobodyさん:2006/07/21(金) 12:17:55 ID:???
>>838
ttp://www.din.or.jp/~ohzaki/perl.htm#httpURL
まあここまでやらなくてもいいと思うが
840nobodyさん:2006/07/21(金) 12:19:14 ID:???
>>838
>>9
テンプレの過去ログ部分うぜえな
841nobodyさん:2006/07/21(金) 12:25:52 ID:???
「『URI』?ぷっ、それって『URL』のこと?『url』と『uri』見間違えてそのまんま覚えてやんのw」
とよくバカにされるんですが、どうしたら良いでしょうか?
842nobodyさん:2006/07/21(金) 12:30:03 ID:???
843nobodyさん:2006/07/21(金) 12:31:22 ID:???
まじめに説明するのは疲れるので相手を見て使い分け。
844nobodyさん:2006/07/21(金) 12:59:56 ID:???
そして葛藤しろ
845nobodyさん:2006/07/21(金) 15:15:48 ID:???
下のコードが無限ループになるのはなぜでしょう?

--ここから--
my $param = '123a456';
my $n = '';
for (;;) {
$param =~ s/[0-9]+//;
$n = defined($&) ? $& : '';
print 'debug $n='.$n.' $parm='.$param."\r\n";
last if ($n eq '') ;
}
print 'end';
--ここまで--

とりあえず for(;;0) のように第三パラメータになんでもいいから
突っ込めば $& が再評価されてループを抜けるのはわかったが、Bad
Know-How くさいので正しいコードを誰か教えて。
846nobodyさん:2006/07/21(金) 15:33:56 ID:bw5ViySC
「スペース(全角・半角問わず)があれば、そのスペースも含めてそれ以降の文字列を全て除去」
というのを正規表現で書くとどうなりますか?
847nobodyさん:2006/07/21(金) 15:36:13 ID:???
ちょっとは考えろ
こうやったけどこうなってできませんでした、とか
848nobodyさん:2006/07/21(金) 15:39:23 ID:???
>>845
$&はThe string matched by the last successful pattern match なので
マッチしなくて置換が行われなかったときに値が変わるのを期待する方が
危険な気がする。s///は置換に成功したかどうかを返すのでそれで分岐
するのが筋じゃないかと。

forの第三パラメタがあったときに値が変わるほうがむしろ不思議だな。

どっちにしろ成功したパターンマッチのすぐ後以外のところでマッチ関係の
変数($<数字>とか$&とか)を使うのは怖いので自分ならしない。
849846:2006/07/21(金) 15:49:32 ID:bw5ViySC
考えてみたものの分かりませんでした。
$moji =~ s/ / /g;
my ($temp undef) = split(/ /,$moji);
850845:2006/07/21(金) 16:05:32 ID:???
>>848
サンクス
$& はマッチしなかった場合 undef になるというのをどっかで読んだんだが。
defined($&) の条件分岐はしないほうがいいてこと?でも for(;;0)のときには
ちゃんと評価されるのが謎なんだよな。
851nobodyさん:2006/07/21(金) 16:08:33 ID:???
>>845
perl -MO=Deparse foo.plで for(;;) とfor(;;1)を比べてみたが、

for(;;)の方は単純に

while(1) { ... }

になるのに対して、for(;;1)の方は

while (1) { do { ... }; '???'; }

となってループ内の実行文がdo ブロックの中に入るかたちに
なっていた。このためfor(;;)の方では最後に成功したマッチが
456の置換になるのに対して、for(;;1)の方ではこのループに入る
前(一度もないのでundef)になるのだろうと思われる。

ちなみに、プログラムの先頭に 'hoge' =~ /.*/; を追加して
for(;;1)を試すと3回目からhogeになる。
852845:2006/07/21(金) 16:35:45 ID:???
ちょっと動作はちがうけど、これでいいのか。ありがと。
my $param = '123a456';
my $n = '';
while (1) {
last unless ($param =~ s/[0-9]+//);
$n = $&;
print 'debug $n='.$n.' $parm='.$param."\r\n";
}
print 'end';
853nobodyさん:2006/07/21(金) 17:08:27 ID:???
普通whileに入れちゃうんじゃないかな
my $param = '123a456';
my $n = '';
while ($param =~ s/[0-9]+//) {
 $n = $&;
 print 'debug $n='.$n.' $parm='.$param."\r\n";
}
print 'end';
854nobodyさん:2006/07/21(金) 18:08:00 ID:???
>>849
絶対こいつは考えてない
855nobodyさん:2006/07/21(金) 18:24:05 ID:???
s/>>846|>>849//g;
856nobodyさん:2006/07/21(金) 18:49:30 ID:???
>>846
s/\s.*//; かな? split を使うなら、第三引数に1がいいかも

>>853
my $param = '123a456';
while ($param =~ s/([0-9]+)//) {
 print 'debug $n='.$1.' $parm='.$param."\r\n";
}

$& を使うと全体が遅くなるから、キャプチャした方が良くない?
857nobodyさん:2006/07/21(金) 19:06:38 ID:???
まあ速さについては前レス嫁ってことだなー。
858nobodyさん:2006/07/21(金) 20:22:51 ID:???
cgiなのに速さ?
余程凄いもん作るわけ?

俺はちょくちょく書き換えるから最適なコードなんて求めない。
早く仕上げることの方が面白いしね。
漫画みたいにズダダダダダーって物事を進めていくのが面白いんだよ。

っていうか画像サイズとかをかんぺきにするだけでじゅうぶんだそ。
859nobodyさん:2006/07/21(金) 20:47:36 ID:???
日本語でおk
860nobodyさん:2006/07/21(金) 20:48:20 ID:??? BE:212256083-#
速い方が気分が良い
861nobodyさん:2006/07/21(金) 21:41:57 ID:???
>>858
( ´,_ゝ`)プッ
862nobodyさん:2006/07/21(金) 23:54:16 ID:???
863nobodyさん:2006/07/22(土) 01:07:15 ID:???
ズダダダダダー
864nobodyさん:2006/07/22(土) 01:25:10 ID:???
速くしたいなら画像サイズとかをかんぺきに!
865nobodyさん:2006/07/22(土) 01:29:11 ID:???
↓そろそろ>>858が「大量に釣れた(藁」とか書き込む
866nobodyさん:2006/07/22(土) 05:06:31 ID:???
ちょっとコーディングの質問なんですが

foreach $test (@test){
print "$test";
}



foreach $test (@test){
$test .= $test;
}
print "$test";


とではどちらが鯖負担の軽減、高速化になりますか?
867nobodyさん:2006/07/22(土) 05:30:37 ID:???
>>866
上。だってやってること違うじゃん。
foreachよりforの方が速いから、上の方のもっと速くするには
for(@test){
print;
}
868nobodyさん:2006/07/22(土) 05:33:09 ID:???
grepについて質問です。
agroupeの要素がbgroupeに含まれていれば、ok!と出力し、
入っていなければ、その要素を出力するスクリプトがうまくいきません。
@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);
for(@agroupe){
if(grep(/^$_$/,@bgroupe)){
print "ok!\n";
} else{
print $_, "\n";
}
}
これでやると全部入っていることになっちゃうんですが、どこが間違ってるでしょうか。
869nobodyさん:2006/07/22(土) 05:40:00 ID:???
>>868
@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);
for my $word (@agroupe){
if(grep(/^$word$/,@bgroupe)){
print "ok!\n";
} else{
print $_, "\n";
}
}
870nobodyさん:2006/07/22(土) 05:43:37 ID:???
でも grep でいちいち探していたら時間がかかるので、一旦ハッシュに入れる事をオススメします。

@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);

my %bgroupe = map { $_ => 1 } @bgroupe;
for (@agroupe){
  if(exists $bgroupe{$_}){
    print "ok!\n";
  } else{
    print $_, "\n";
  }
}
871nobodyさん:2006/07/22(土) 05:47:20 ID:???
>>869
ありがとうございます。
そうか、grepの場合、$_にはそのループのデフォの$_じゃなくて
比較対象の要素が入ってるんですね。前も引っかかったのに忘れてて
小一時間損したぁぁ。
ちなみに
if(grep(/^$word$/,@bgroupe)){
print "ok!\n";
} else{
print $word, "\n"; # print $_, "\n";だと何も出てこない!
}
872nobodyさん:2006/07/22(土) 05:49:11 ID:???
>>870
ハッシュを使えば速いんですね。確認しました。ありがとうございました。
873nobodyさん:2006/07/22(土) 09:05:18 ID:???
>>835
本当にそのコードなんだったらチェックは付かない。
しかし実際は、そのコードからは出力されるはずのない
<tr><td><input type=checkbox name=chk1 value=1 checked></td><td>洗顔</td></tr>
という行が出力されている。(checkedの部分が問題
つまり
print "<tr><td><input type=checkbox name=chk$cnt value=1";
print "></td><td><b>$_</b></td></tr>\n";
の2行の間に「すでにチェックされたかどうか」を判定するコードが実際には入ってると考えられる。
その部分のコードを削除すればたぶんOK
874nobodyさん:2006/07/22(土) 17:39:40 ID:???
そろそろ
my $foo = "hoge";
print "$foo";
みたいに文字列を無駄なダブルクォートで囲う人が居なくなって欲しい。
>>866 みたいなやつ。

ダブルクォートで囲うと新しい文字列を作る事になるから
上のような場合は、ただの無駄にしかならない
($fooと全く同じ文字列を作って表示している)。

一体、どこで習ってくるんだろう。
KENTもそこまで酷くないよね?
875nobodyさん:2006/07/22(土) 17:41:47 ID:???
このスレって日によって温度差かなりあるよね。
876nobodyさん:2006/07/22(土) 18:08:55 ID:???
最適化されて消えるでしょ。
$fooと同じ文字列をわざわざ作るなんて馬鹿なコンパイラはない。
877nobodyさん:2006/07/22(土) 18:18:33 ID:??? BE:371448476-#
ベンチ取ったら5倍も違ったー
878nobodyさん:2006/07/22(土) 18:50:39 ID:???
>>876

$ perl 876.pl 2>/dev/null
Benchmark: timing 1000000 iterations of bare, quote...
bare: 2 wallclock secs ( 0.78 usr + 0.53 sys = 1.31 CPU) @ 762776.51/s (n=1000000)
quote: 1 wallclock secs ( 0.96 usr + 0.56 sys = 1.52 CPU) @ 657030.22/s (n=1000000)

$ cat 876.pl
use Benchmark;

my $foo = 'bar';
timethese(1_000_000,
{'quote'=>sub {print STDERR "$foo";},
'bare'=>sub {print STDERR $foo;},
});
879nobodyさん:2006/07/22(土) 18:55:33 ID:???
DWIMの言語なわけで、プログラマーのわがまま通りにかけるのも
魅力のひとつだと思う・・・
880nobodyさん:2006/07/22(土) 19:40:53 ID:???
$ perl 876.pl
Benchmark: timing 1000000 iterations of bare, quote...
bare: -1 wallclock secs ( 0.11 usr + 0.00 sys = 0.11 CPU) @ 9090909.09/s (n=1000000)
(warning: too few iterations for a reliable count)
quote: -1 wallclock secs ( 0.20 usr + 0.00 sys = 0.20 CPU) @ 5000000.00/s (n=1000000)
(warning: too few iterations for a reliable count)
$ cat 876.pl
use Benchmark;

my $foo = 'bar';
timethese(1_000_000,
{
'quote'=>sub {$boo="$foo";},
'bare'=>sub {$boo=$foo;},
});
printしないとこんなかんじ
881nobodyさん:2006/07/22(土) 21:43:50 ID:???
>>876
"" で括るのは、新しい文字列の生成という意味だから、最適化はされないよ。
-MO=Deparse 付けてみても、"$foo" そのまま。
882nobodyさん:2006/07/23(日) 01:44:22 ID:NrRWf3Mx
どうでもいいけど、次スレから
「Perl・CGIコーディング初心者質問スレ」
に変えるべきだと思う。
883nobodyさん:2006/07/23(日) 01:46:04 ID:BeERA3x6
>>872
念のため言っておくけどハッシュにすると遅いよ。
可読性があがるからコーディングが早いってだけ

でもハッシュ使っとけ
884nobodyさん:2006/07/23(日) 02:08:35 ID:???
>>882
"CGI コーディング" ってなんだ?
885nobodyさん:2006/07/23(日) 02:19:16 ID:???
>>872
速さを求めたいならはじめに両方の要素をソートしておくことをお勧めする。
もちろんそれに応じたコーディングも必要だが要素数が多ければ目に見える効果があるはず。
886nobodyさん:2006/07/23(日) 03:06:54 ID:???
拾ってきたコードに
if ($ENV{'PERLXS'} eq "PerlIS") {
print "HTTP/1.0 302 Temporary Redirection\n";
print "Content-type:text/html\n";
}
という記述があったんですが意味がよく分かりません。
分かる人、翻訳お願いできませんか?
887nobodyさん:2006/07/23(日) 03:31:22 ID:???
>>886
検索したらすぐに解ったが…
ttp://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html#My_CGI_scripts_don_t_seem_to_run
ttp://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html#How_does_my_script_know_if_it_s_

「ISAPIで実行されていたらステータス行とContent-Typeヘッダ吐き出せ」
888886:2006/07/23(日) 03:35:53 ID:???
>>887
すみません。まさか検索で引っかかるとは思いが至らず・・・。
要は削除してしまっても問題ない箇所なんですね。
こんな時間にありがとうございました。
889nobodyさん:2006/07/23(日) 03:44:25 ID:671DuE1H
>>874
うざいよ、藻前。
>my $foo = "hoge";
>print "$foo";
>みたいに文字列を無駄なダブルクォートで囲う人が居なくなって欲しい。
上のは必要。下のは"$foo\n"が普通なので必要。ちなみに$foo,"\n"より速い。
890nobodyさん:2006/07/23(日) 11:48:54 ID:???
>>889
>上のは必要
お前、何当たり前の事言ってんだ…。

>下のは"$foo¥n"が普通なので必要
コード違うじゃん。誰が改行付ける時の話してる?
891nobodyさん:2006/07/23(日) 11:56:10 ID:???
ここは初心者質問スレ
892nobodyさん:2006/07/23(日) 12:16:20 ID:rog/ar/G
誰か教えてください。
perl-5.8.8で、URLエンコーディングのデコードをやりたいと思っています。
以下の様にやってみました。

 use encoding "euc-jp";
 $str = "%C6%FC%CB%DC";
 $str =~ tr/+/ /;
 $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
 print $str;

が、何も出力されません。

use encoding "euc-jp" を除くと正しく出力("日本")されるのですが、
この部分は入出力の関係上できればのこしておきたいと思っています。

どうしたら解決できるか、どなたかお分かりの方教えてください。
893速さ順:2006/07/23(日) 13:08:12 ID:???
$foo."\n"
"$foo\n"
$foo,"\n"

こんな感じか?それなら文字列連結でいいんじゃね
894nobodyさん:2006/07/23(日) 13:30:13 ID:???
>>892
これじゃだめなの?
use encoding "euc-jp";
{
  no encoding;
  $str = "%C6%FC%CB%DC";
  $str =~ tr/+/ /;
  $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
}
print $str;
895nobodyさん:2006/07/23(日) 14:44:30 ID:???
>>890
なんかこないだから一人ずれてるのいるよね・・・。

>>892 がなんで use encoding 下でダメなのか説明おねがいえらいひと。
896ヽ(´ー`)ノ ◆.ogCuANUcE :2006/07/23(日) 17:23:10 ID:???
>>892
解決法は >>894、もしくは use encoding を使わない。

理由は perldoc encoding の DO NOT MIX MULTIPLE ENCODINGS のあたりを参照。

use encoding "euc-jp";

my $str = '%C6%FC%CB%DC';

print "before: $str (" . length($str) . ")\n";

$str .= "\xFE";

print "after : $str (" . length($str) . ")\n";

use encoding については、作った本人が「使うな」と言ってる上に、
副作用が多すぎる。
新規で書くコードに関しては、Encode.pm で適宜変換するようにして、
文字リテラルには ascii しか書かないか、use utf8 をして utf-8 に
統一してしまうかの、どちらかを選択するべき。
古いコードで use encoding しているものは、no encoding で逃げるか、
駄目なら書き直すべし。

知ってる人間が use encoding 使ってたら、確実に殴る。
897nobodyさん:2006/07/23(日) 17:35:06 ID:???
print << "HOGEHOGE";
unko
HOGEHOGE

これの << ってなんだっけ
名称をどわすれした
898nobodyさん:2006/07/23(日) 17:51:27 ID:???
ヒアドキュメント Here Document
899nobodyさん:2006/07/23(日) 18:45:27 ID:???
>>896
ああ、そうか。 なるほどねー。
use encoding "euc-jp"; 下では
$str = "\xc6";
$str .= "\xfc";
$str .= "\xcb";
$str .= "\xdc";
こう書いても $str は "日本" ってはならないわけだな。 ic ic
900nobodyさん:2006/07/24(月) 01:13:30 ID:ga9J27XZ
^が改行の直後にマッチしません!!
901nobodyさん:2006/07/24(月) 02:23:23 ID:???
mオプションつけたらできた
902nobodyさん:2006/07/24(月) 10:35:48 ID:78lGpjq9
# $timeには動いた時の時刻が入っています
open FH,"+>>test.log";
seek FH,0,0;
print FH "$time","\n";
close FH;

test.logの先頭に一行新しく入れたいのですが、これだと末尾に一行追加されます・・・・
多分+>>のせいだと思いますが、先頭に入れようとしたら、

my @list=<FH>;
truncate FH,0;
print FH $time,"\n";
print FH @list;

とするしかないのでしょうか?
なんかいちいち一旦全部配列に入れてファイルを消してってのが嫌です。
903902:2006/07/24(月) 10:39:56 ID:78lGpjq9
あ、後者のコードに
seek FH,0,0;
がないと@tempに何も入りませんね。

しかしなんでそこでのseekは効くのに、前者の方ではうまくいかないんだろう
904902:2006/07/24(月) 11:25:03 ID:78lGpjq9
うお。今日誰もいないのね。
905nobodyさん:2006/07/24(月) 11:51:01 ID:???
受信メールをPerlで受けて処理したいのですが、パースするモジュールとかありますか?
906nobodyさん:2006/07/24(月) 11:56:03 ID:???
115311
こういうフォーマットの文字列を
11時53分11秒
に変換したいです。
なるべく短い記述ですませいたいのですが。

できれば2バイトずつで自動スプリットできればそのままsprintfに渡せるのですが。
substrを3個も書いてsprintfに渡すのはなえますよね。
907nobodyさん:2006/07/24(月) 12:03:49 ID:???
>>906
>>396,397
908nobodyさん:2006/07/24(月) 12:22:19 ID:???
>>902

基本的に追記はファイル末尾に行う。
読み出し方を工夫したほうがいい。
909nobodyさん:2006/07/24(月) 12:23:35 ID:???
906

>>907
そういえば正規表現でいけましたね。ありゃ()がミソでしたね確か。

396は本当になるほど!って感じです。
unpackはまるで使いこなせていないままでしたが便利なものですねこれ。

910905:2006/07/24(月) 12:35:23 ID:TyNTrbq3
911nobodyさん:2006/07/24(月) 13:02:47 ID:???
>>902
基本的に内容消さないで最初の行に追加する方法は無いと思う。
解決法としては、逆に、使うときに、my @list = reverse <FH>;
とか、foreach(reverse <FH>)
とかするとか、・・・
912nobodyさん:2006/07/24(月) 13:16:16 ID:???
search.cpan.org がアドレス解決できないもうだめだ
913902:2006/07/24(月) 13:20:39 ID:78lGpjq9
やっぱり・・・
あきらめス。
ありがとうございす。
914nobodyさん:2006/07/24(月) 15:16:26 ID:???
>>911

馬鹿、またそうやって全部メモリに読み込んで。
しかも foreach でもう一度展開して。
勘弁してくれ。

>>913

http://perldoc.jp/docs/modules/File-ReadBackwards-1.02/ReadBackwards.pod

>このモジュールはファイルを行単位で逆方向に読み込みます。
>使い方は簡単で、メモリの使い方は効率的で高速です。
>オブジェクトとtieされたハンドル・インターフェイスの両方を
>サポートしています。

使わない理由は無い。
915nobodyさん:2006/07/24(月) 16:33:06 ID:???
う〜ん、とりあえず巨大ファイル扱うようなコード書かないので、
正直メモリ展開とか実感できない・・・1ミリ秒か100ミリ秒かとか体感違いないので・・・
昔のコンピュータを使ったこと無いってのもあるかも・・・
916nobodyさん:2006/07/24(月) 16:40:34 ID:???
まあ、その辺の違いが致命的な仕事したくなったらperlはプロトタイプで、
cとかで実装するかなぁ・・・と思う、・・・(今のとこそういうプロジェクトの予定無し・・・

個人的にforeach(reverse <fh>){.....}なんかは見やすいのでがんがん使う。
まあ、遅いって言ってもせいぜい多項式オーダーの遅さだと思うので、あまり気にしない
指数オーダーだったら大変だが・・・w
917nobodyさん:2006/07/24(月) 16:58:47 ID:???
だいたいは読むより書く方が頻度少ないんだから、黙ってファイルの最初につけて書けばいいやんね。
my @list=<FH>; はよろしくないけどw
918nobodyさん:2006/07/24(月) 18:27:39 ID:LY53xScL
package HOGE::List;

↑のように、パッケージファイル(List.pm)を更新しても、Webページで反映されません。
.cgiを持つ拡張子のファイルは反映されます。
これはどのようなことが原因ですか?
どのようにすればList.pmで書き換えた内容の更新が反映されるようになりますか?
919nobodyさん:2006/07/24(月) 18:44:08 ID:???
>パッケージファイル(List.pm)を更新しても、Webページで反映されません。
んな訳ない
920nobodyさん:2006/07/24(月) 18:46:52 ID:???
mod_perl?
921nobodyさん:2006/07/24(月) 18:58:52 ID:???
どうせアップロードし忘れてるんでしょうね
922nobodyさん:2006/07/24(月) 19:16:35 ID:???
mod_perlだとキャッシュが残っちゃうときあるよな
923nobodyさん:2006/07/24(月) 19:24:17 ID:???
書き込みの質問が読み込みの質問にされてる件
924nobodyさん:2006/07/24(月) 19:40:51 ID:???
同名のファイルを別のとこにあげてて、そっち取られてるとかはたまに俺もやるw
925nobodyさん:2006/07/24(月) 19:46:47 ID:???
>>902
テンポラリファイル作って一行出力してから元ファイルから残りを追記後
リネームでもできるけど一緒にロックせにゃならんし残った後のこともあるな。
>>906
substr($str,0,2),substr($str,2,2),substr($str,4,2)
でもできるだろう。数字と判定してからのほうがよいと思うけど。
926nobodyさん:2006/07/24(月) 19:52:51 ID:???
>>925
本人が萎えると言ってる方法を提示してどうする…。
927nobodyさん:2006/07/24(月) 20:13:17 ID:???
>>906
$date = "115311";
$date =~ s/(\d\d)(\d\d)(\d\d)/$1時$2分$3秒/;
928nobodyさん:2006/07/24(月) 20:49:14 ID:???
悪い見逃してた。まあ自分なら正規表現使うな
929nobodyさん:2006/07/24(月) 20:53:25 ID:???
わざわざまともなスクリプトかけないこと暴露しなくていいのに
930nobodyさん:2006/07/24(月) 21:09:27 ID:???
初心者の初心者による初心者のためのスレなんだから、仕様ですね。
931ヽ(´ー`)ノ ◆.ogCuANUcE :2006/07/24(月) 21:16:05 ID:???
個人的には POSIX::strptime が好みだな。

残念ながら、標準では入ってないが。
932nobodyさん:2006/07/24(月) 21:54:20 ID:???
>>905
つ MIME::Parser
933nobodyさん:2006/07/24(月) 22:22:30 ID:IKH596di
はじめまして、kent webさんのttp://www.kent-web.com/bbs/
YY-BOARDを使っていますが最近英語の荒らし書き込みが増えちゃって困っています
そこで相談したところ「半角のみの投稿を禁止すればよい」という話を
聞いたのですが実際にスクリプトを変更する技術がなく出来ませんが
どなたか実際に使っている方などいたりしませんか?
アドバイスよろしくお願いいたします。
934nobodyさん:2006/07/24(月) 22:46:14 ID:???
>>933
KENT WEB総合スレへドゾ。改造方法もあるでよ。

http://pc8.2ch.net/test/read.cgi/php/1078991985/450-
935933:2006/07/24(月) 23:13:25 ID:???
>>934
ありがとうございました。そのような記事があるのを見落としてました・・
936nobodyさん:2006/07/24(月) 23:59:23 ID:cgyCzAHv
以前、下記の質問をした際に「過去ログに書いてある」との事でしたが
見つけた内容は行いたい処理とは違う物しか発見できませんでした。
どなたか、下記の内容について処理方法を概要だけでも結構ですので
ご教授お願い出来ないでしょうか?宜しくお願い致します。

----
HTML内のフォームからファイルと時間を選択させて、
その時間になったら自動で指定ファイルをFTPで別サーバー
へ移動するという処理は可能でしょうか?
Perlでcrontabに書き出すことができればと思いましたが
レンタルサーバーでそれは許可されておりません。
cronを使用せずにperlにより指定時間になっているかどうかを
チェックして時間になっていたらFTPでファイルを移動
するような処理は可能なのでしょうか?
937nobodyさん:2006/07/25(火) 00:19:33 ID:???
>cronを使用せずにperlにより指定時間になっているかどうかをチェック

この場合プログラムが能動的に動くことは不可能。
ただスクリプトがアクセスされたときに指定時間になっているかをチェックすることは十分可能。

ほかはperlの機能としては全て可能だが、サーバーにより制限がかかっている場合もある。
938nobodyさん:2006/07/25(火) 00:30:15 ID:???
自分のPC常時つけといて、時間チェックしてファイル移動するcgiに、JavaScript使って1秒ごとにアクセスすればいいんじゃね?
939nobodyさん:2006/07/25(火) 00:43:59 ID:???
forkさえ使えればゴニョゴニョ(ry
940nobodyさん:2006/07/25(火) 00:46:36 ID:???
いっそメール経由で自鯖に送信して自鯖からFTPうp
941nobodyさん:2006/07/25(火) 00:48:44 ID:???
perl -MCPAN -e shell でインストールする場合、
最新版がインストールされますが、
昔のバージョンを指定し、かつ、そのバージョン
と依存関係のあるものをインストールすることって
できますか?
942nobodyさん:2006/07/25(火) 01:08:00 ID:???
>この場合プログラムが能動的に動くことは不可能。
そうですか。有難うございます。
やはりcrontabに書かせるしかないのですね・・・
ホスティングでcrontabを変更できる所は日本であるのでしょうか?

>fork
forkで時間指定になるまで子供を常駐させるという事なのでしょうか?
もう少し詳しく教えていただけないでしょうか?
943nobodyさん:2006/07/25(火) 03:11:29 ID:???
デイリーのスクリプトを指定できるのは知ってる
944nobodyさん:2006/07/25(火) 09:30:20 ID:???
>>937
>この場合プログラムが能動的に動くことは不可能。
無限ループ内にsleepなり時間チェックの関数書いとけば可能。
ただ、>>937の言うように「サーバーにより制限がかかっている場合」に注意。
945nobodyさん:2006/07/25(火) 10:15:47 ID:???
もっと別のやり方考えたほうがいいよ
なにがしたいのかわからんけど。
946nobodyさん:2006/07/25(火) 11:45:48 ID:???
サーバーの設定で run time に制限かかってなくても、酷いスクリプトは管理者によって kill されるか、
パーミッションをいじられて実行不可にさせられるのが共有サーバー。
自鯖にするか占有を借りれば好きかってできるかと。
947902:2006/07/25(火) 11:52:35 ID:kxudY76D
>>914
せっかくなのですが。
ファイルの一番上の行に書き込む時より、全部を読み込んで処理して表示する時の
方が他にも処理があり、頻度も五分ですのでアsdgjな;ぐあwbんrgぅじぇbんぎl

ファイルに書き込むときに最上部に書いた方が今回の場合はグラッリェなのです。

すいません。ありがとうおざいます。もう肌がヒリヒリしてたえられrません。
病院にいきってててててててえてtwえまsづあsd。あdgsgfdsあ
948902:2006/07/25(火) 11:56:06 ID:kxudY76D
>>917
>my @list=<FH>; はよろしくないけどw

どうしてですか?一見完璧に見えますが。実のところ落とし穴があるのでしょうか?
やっぱり違いますねこのスレは。なんかプロに教わってる感じで最高です。

お返事お待ちしております。とりあえず病院に行ってきます。
なんか肌がボロボロやぶれて血だらけになってしまいました。
なんですかね。これ・・・・orz
949nobodyさん:2006/07/25(火) 12:06:57 ID:???
>>944
>無限ループ内にsleepなり時間チェックの関数書いとけば可能。

何か勘違いしてないか?
お前のサーバーでは無限ループの中にsleepなり時間チェックの関数書いたプログラムが勝手に立ち上がるの?
結局そのプログラム自体は誰かからアクセスされることによってしか起動し得ないわけでしょ?
そもそも時間がたてば普通にkillされるし。
950nobodyさん:2006/07/25(火) 12:11:52 ID:???
とりあえず病院池www
951nobodyさん:2006/07/25(火) 12:13:12 ID:???
> そもそも時間がたてば普通にkillされるし。
952nobodyさん:2006/07/25(火) 12:17:22 ID:???
最初の起動はコマンドラインから叩けばいい
あとは時間チェックとスリープ組み込んだ無限fork
絶対怒られるけど。
953nobodyさん:2006/07/25(火) 12:32:25 ID:???
>>952
失敗するとゾンビが腐るほどたまったりするからなw
954nobodyさん:2006/07/25(火) 13:25:59 ID:???
http://sourceforge.net/project/showfiles.php?group_id=74976
qmHandle って最新Ver1.2.0でDecember 10, 2003なんだけど、
今だったらもっといいスクリプトとかあるかな?教えてエロイひと
955nobodyさん:2006/07/25(火) 13:55:36 ID:???
>>948
ィ`w

@list って配列他に使わないのであれば、<FH> するより一気に read した方がいいよ、ってことかな。
956nobodyさん:2006/07/25(火) 13:59:10 ID:???
うちの環境では<FH>の方がreadより若干速い。
957nobodyさん:2006/07/25(火) 14:00:52 ID:???
>>956
1行1行読む <FH> でのこと? うそやろ・・・(´・ω・`)
958nobodyさん:2006/07/25(火) 14:53:00 ID:???
ファイルを何らかのマーカー(一般には改行文字)で区切って読み込む場合

open FH, 'example.data';
my @list = <FH>
foreach( @list ){
処理
}

より

open FH, 'example.data';
while( <FH> ){
処理
}

のほうが一般に高速、メモリの使用量も少ない。
前者はファイルに保存してある情報を全てメモリ上にぶちまけた上でその情報を使って処理するのに対して、
後者はそのときの処理に必要な部分のみをファイルからメモリに読み取って処理を行う。

ディスクアクセスのキャッシングは OS がシステム全体の状況に応じて行ってくれるので
間欠アクセスによるシークロスは気にする必要は無い。
959nobodyさん:2006/07/25(火) 14:57:44 ID:???
>>892
use encoding qw(euc-jp);
use Encode qw(from_to encode decode);

my $str = "%C6%FC%CB%DC";
$str =~ tr/+/ /;
$str = encode("utf8", $str); # utfフラグを落とす
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
from_to($str, "euc-jp", "utf8"); # 変換
$str = decode("utf8", $str); # utfフラグを付ける
print $str;

でだめなん?
960nobodyさん:2006/07/25(火) 16:17:48 ID:p7nXlRS6
アップローダーを作成したのですが、15M程度のファイルなら
問題なくアップできるのですが、100M近いものになると
「ページを表示できません。検索中のページは現在、利用できません。
Web サイトに技術的な問題が発生しているか、ブラウザの設定を調整
する必要があります。」
のエラーが発生してしまいます。
CGIでのファイル制限は設けていないのですがこのような症状になって
しまいます。どなたかご存知の方ご教授お願い致します。
961nobodyさん:2006/07/25(火) 16:28:28 ID:???
timeoutとか
962nobodyさん:2006/07/25(火) 16:42:24 ID:???
>timeoutとか
timeoutはアップの途中でも起こることなのでしょうか?
もしそうだとしたらtimeoutを防ぐ(ごまかす?)手段などはありますか?
963nobodyさん:2006/07/25(火) 16:50:00 ID:???
レン鯖デバッガーかよ。しかもIEの簡易エラー表示なんてもってのほか。
964nobodyさん:2006/07/25(火) 17:04:06 ID:???
>しかもIEの簡易エラー表示なんてもってのほか
申し訳ありません。下記がログに残されているメッセージです。
CGI.pm: Server closed socket during multipart read (client aborted?).
965nobodyさん:2006/07/25(火) 17:20:00 ID:???
>>964
CGI.pmが腐ってるんじゃないの
自分でparseしたら
966nobodyさん:2006/07/25(火) 19:41:41 ID:???
>>965
おいおい
967nobodyさん:2006/07/25(火) 19:54:02 ID:???
>CGI.pmが腐ってるんじゃないの

みたいに適当な初心者が

>自分でparseしたら

ですか。
お前にCGIモジュール以上のものが書けるのかと問いたい問い詰めたい、小一時間ほど。
どうせおまえ KEMT からコピペするだけと違うんかと。
っていうか server も close も socket も during ...も中学レベルの単語じゃねぇか。
968nobodyさん:2006/07/25(火) 20:00:23 ID:???
富○県から引っ越すんだ!!
969nobodyさん:2006/07/25(火) 21:50:03 ID:???
>>964
てことはクライアント側でなんか起こってるんじゃないの?
どうしてもだめならファイル自体分割するとか・・・
970nobodyさん:2006/07/26(水) 10:23:21 ID:???
apacheなら入力出来るサイズをhttpd.confで増やす。
phpならphp.iniで入力サイズを増やす。
あと、perlならアップするファイルサイズの約二倍の物理メモリを。

そしてもう来るな
971nobodyさん:2006/07/26(水) 11:01:41 ID:???
>>970
>そしてもう来るな
?
972nobodyさん:2006/07/26(水) 11:37:01 ID:???
> あと、perlならアップするファイルサイズの約二倍の物理メモリを。

それはすごい perl ですね。
973nobodyさん:2006/07/26(水) 11:37:58 ID:???
SJISから特定の文字列($target)を[16進]で置き換えたく以下の処理をしてるんですが、

sub change{
my ($in) = @_;
my $sjis_str = '[\x81-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
my $target = '[\xF7][\x41-\x9B\xA1-\xFA]|[\xF9][\x41-\x9B\xA1-\xED]|[\xFB][\x41-\x8d\xA1-\xD9]';
$in =~ s/\G((?:$sjis_str)*)($target)/$1.'['.unpack('H4',$2).']'/ego;
return $in;
}

sjisとtargetがかぶってしまっています。$sjis_strから$targetを除くとどう表現できますかね?
文字コードテーブルはよーわからんヽ(+∇+)ノ
974nobodyさん:2006/07/26(水) 12:04:59 ID:JkK9HWj1
2006724,hogehogehogeoegoegeg
2006723,akjhkadghjhgiower

Text::CSV_XSを使ってCSV形式で保存してます。
アクセスログなので結構膨大です。
日付別に分別したいのですが何かいい案はありますか?
ハッシュのキーに数字のみが使えたらよかったですが。無理ですし。
で、まあdateとかつけようと思ったのですが。
push @$hash{date$temp[0]},$csv->string();
みたいな。

なんかうまくいきませんね。グローバルシンボルじゃボケエラーがでますが。
もちろんmy宣言はしてるのです。問題なく。
でりふぁれんす部分がおかしいかキーの中のやり方がおかしいかですね。


975974:2006/07/26(水) 12:13:15 ID:JkK9HWj1
勘違いorz

push @{$hash{$temp[0]}},$csv->string();
で動いた。
っていうかperlってキーに数字のみも使えるのね。便利すぎ
976nobodyさん:2006/07/26(水) 12:13:57 ID:???
まあ数字も文字なわけで・・・
977nobodyさん:2006/07/26(水) 12:32:06 ID:???
awkの伝統?
978974:2006/07/26(水) 13:52:08 ID:JkK9HWj1
すいませんでした。

あれから色々と進めてカベにぶち当たってなんとか解決して。
でもイマイチなのでよりよい記述をアドバイス願います。

ループ処理をするときに
foreach(keys %hash){}
とやると$_に入りますが、これを$dateに入れたいのです。
今は
while(my($date,)=each %hash){}
としてますが、なんか不満が残る記述方法です。
もっとスマートなやりかたはないでしょうか。

それと連続ですみませんがもう一つ。
上記のやつでさらにkeyをsortしてから取り出したいのですが、each sort %hashだとエラーになってしまいました。
カッコもつけてみたのですがだめでした。これもできればスマートに・

宜しくお願いします。
979nobodyさん:2006/07/26(水) 14:23:02 ID:???
my %hash = (
key1 => 'data1',
key2 => 'data2',
key3 => 'data3',
key5 => 'data5',
key4 => 'data4',
);
my $key;

print "Unsorted Result\n";
foreach $key ( keys %hash ){
print " $key\t$hash{$key}\n";
}

print "\n\nSorted Result\n";
foreach $key ( sort keys %hash ){
print " $key\t$hash{$key}\n";
}
980974:2006/07/26(水) 14:28:07 ID:JkK9HWj1
なるほど!
さっき試しに
while(my($date,)=keys %hash){}
してみたら無限ループでクラッシュするかと思いましたよ。

ありがとうございました。
981974:2006/07/26(水) 14:32:56 ID:JkK9HWj1
ところで無限ループにはいつもこまってるのですが、
せめて処理開始から1分が経過したら自動でexit()が発動するようなことはできないんでしょうか?
そうすればループが無限してもパソコンは安心ですよね。
982nobodyさん:2006/07/26(水) 14:55:54 ID:???
無理ざます。そんなのあったらとっくに広まってるざます。
だからみんな危ないかなってときはループが一定回数を超えたら処理をエラーメッセージと共に
処理を中断させるんざます。
983nobodyさん:2006/07/26(水) 15:07:27 ID:???
プログラム開始時にアラームでもセットすれば?
984nobodyさん:2006/07/26(水) 15:09:52 ID:??? BE:238789139-BRZ
出来るよ
985nobodyさん:2006/07/26(水) 15:39:28 ID:???
SpiderMonkeyのJS_SetBranchCallbackみたいなのってないの?
986nobodyさん:2006/07/26(水) 15:52:09 ID:???
>>981
普通にできるよ。

>>982
(ry
987974:2006/07/26(水) 16:04:23 ID:JkK9HWj1
http://perl.misty.ne.jp/function01/alarm.html

ここ読んでalarmが何かを理解しようと思いましたが、どうやら他にも理解しないといけないことがあるようで。
実行中のプロセスにSIGALARMシグナルをおくられてもね・・・

どっかで受け取る処理をするのか?
そのシグナルがきたら発動するようにできるのか?

そこらへんをこのサイトも書いてくれてたら・・・・
でもこのサイト質問すると答えてくれる。最高な管理人だからこんなこと言うの恐縮だ
988nobodyさん:2006/07/26(水) 16:13:20 ID:??? BE:716364599-BRZ
( ゚д゚)ポカーン
989974:2006/07/26(水) 16:16:59 ID:JkK9HWj1
m(__)m
990nobodyさん:2006/07/26(水) 17:29:19 ID:???
>>987
そこに受け取る処理も何も全部書いてあるんだが。
それ読んで分からなければ、perldoc -f alarm 読んでも分からんだろうな…。
基本的に同じ事が書いてあるから。
991nobodyさん:2006/07/26(水) 20:29:14 ID:???
>>973
(?:$sjis_str)* のとこを (?:$sjis_str)*? にしてみてわ?
ってか >>973 の場合 \G いらないと思うんだけど。
992nobodyさん:2006/07/27(木) 09:50:11 ID:1uzwaimq
trust::error_print() if $form{test} =~ /\D|\d{2}/;

中身に数字以外を含むか、数字だけでも1桁でなければ
エラー分を出力してexitするルーチンを呼びたいのですが、
上記で穴は完全にふさげてますでしょうか?
993nobodyさん:2006/07/27(木) 10:14:26 ID:???
無限ループの例
for ( $i=0; $i<0; $i++ ) {
print $i;
}
このプログラムでは、初期値を0に設定してループごとに1足していっているのですが
終了の条件が 「0未満になった場合」 となっています。
0から1づつ足していってるので、「0未満」 となるはずもなく、0からの数字が延々と表示され続けます。


↑これって本当ですか?forの条件式部分って確かifと同じでしたよね。
だから0未満であれば実行するんであって、0未満でない上記の場合は一度も実行しないはずですが。

私が間違ってますか?
994nobodyさん:2006/07/27(木) 10:52:50 ID:???
> ↑これって本当ですか?forの条件式部分って確かifと同じでしたよね。
大嘘。そんなこと言ってる奴は葬ってしまう事が社会正義なので晒してください。
995993:2006/07/27(木) 11:10:17 ID:???
>>994
色々勉強させてもらったサイトなのでご勘弁をm(__)m
回答ありがとうございました。失礼します。
996nobodyさん:2006/07/27(木) 11:26:26 ID:???
my %test = qw/a 1 b 4 c 2/;
これを値の数値が小さい順に並べ替えたいのですがsどうやればいいでしょうか。
997nobodyさん:2006/07/27(木) 11:31:29 ID:???
my %test = qw/a 1 b 4 c 2/;
my @row = sort{$test{$a} <=> $test{$b} }keys %test;
print @test{@row};

なんか知らないけど試してたら偶然カスリました。
ここから後は自分でいけそうです。996でした。
998nobodyさん:2006/07/27(木) 11:43:39 ID:???
999nobodyさん:2006/07/27(木) 11:52:44 ID:???
@a = qw/1 2 3 4 5 6 7 8 9/;
print $a[int rand @a];

これでそれなりに全てが平等に抽選できてますかね?
1000nobodyさん:2006/07/27(木) 12:13:11 ID:???
>>999
バ〜カ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。