[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 05/09 23:45 / Filesize : 95 KB / Number-of Response : 271
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:nobodyさん mailto:sage [2009/09/03(木) 23:51:12 ID:???]
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ pc11.2ch.net/test/read.cgi/php/1234752149/


2 名前:nobodyさん mailto:sage [2009/09/03(木) 23:52:22 ID:???]
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://ascii.asciimw.jp/books/books/detail/4-7561-3057-7.shtml
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル]
最新のドキュメント: ttp://perldoc.perl.org/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perldoc きまぐれ訳: ttp://fleur.hio.jp/perldoc/
perldoc.jp: ttp://www.perldoc.jp/

[モジュール]
CPAN: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perlの小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8Unicodeメモ]
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html


3 名前:nobodyさん mailto:sage [2009/09/04(金) 05:49:19 ID:???]
いちおつー。

4 名前:nobodyさん mailto:sage [2009/09/04(金) 13:17:39 ID:???]
4様

5 名前:nobodyさん mailto:sage [2009/09/04(金) 15:10:46 ID:???]
私が立てた過疎スレもどうぞよろしく

【Perl,CGI】参考書籍 第四版
pc11.2ch.net/test/read.cgi/php/1250989562/

6 名前:nobodyさん [2009/09/10(木) 01:26:11 ID:tlO5UesG]
最初の質問させていただきます。
演劇サークルで次に演じる脚本があるのですが、その脚本が、セリフが役名:セリフか役名:セリフで区切ってあり、
ト書きとわかりづらいということでhtmlのtableを使って表にしようとしたのですが、文法チェックにかけると
syntax error at C:\cgi\henkan\sreplace.cgi line 10, near ") {"
syntax error at C:\cgi\henkan\sreplace.cgi line 30, near "}"
C:\cgi\henkan\sreplace.cgi had compilation errors.
と出て、whileの実行式部分のカッコにエラーが出るし、それを削除してもsplitで値を代入する先の()が不要だ、と出ます。
次に貼るソースコードのどこに問題があるか教えていただければ幸いです。
わかりにくいと思いますので
要するに、
$fileというファイルの文を、$splitをデミリタにして$nameと$naiyouに分けて代入し、
$naiyouの値が空なら(ト書きのとき)$nameを$naiyouに代入、その内容を二つのファイルに分けて保存し、
最後にそれをまとめて二つの<TD>に$nameと$naiyouがきれいに分かれているhtmlファイルを作りたいのです。
下のコードのどこが問題なのか教えてください。

7 名前:nobodyさん [2009/09/10(木) 01:28:19 ID:tlO5UesG]
#!/usr/local/bin/perl

use CGI;
$q = new CGI;

$file = $q->param('file');
$split = $q->param('split');

open(FILE, "<$file")
while($ln = <FILE>) {
$ln =~ s/\n/<br>/g;
$ln =~ s/$split/$split<b>/g;

($name, $naiyou) = split(/$split/, $ln);

if($naiyou == "")
{$name = $naiyou ;
}
unless($name == ""){
$naiyou = "$naiyou</b>";
}

続きは次に書きます。

8 名前:nobodyさん [2009/09/10(木) 01:29:56 ID:tlO5UesG]
open(OUT,"> name.log");
print OUT "$name";
close(OUT);
open(PUT,"> naiyou.log");
print PUT "$naiyou";
close(PUT);
}

close(FILE);

open(IN,"< name.log");
@name = <IN>;
close(IN);

open(RE,"< naiyou.log");
@naiyou = <RE>;
close(RE);


print "Content-type: text/html; charset=Shift_JIS\n\n";
print "<html>\n<head><title>移動</title></head>";
print "<body><a href='kyakuhon.html'>脚本へ移動<\/a></body>\n</html>";

open(SYU,"> kyakuhon.html");
print SYU "<html>\n<head>\n";
print SYU "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">\n";
print SYU "<title>Scenario</title>\n";
print SYU "</head>\n";
もう一度次です。長くなって申し訳ないです

9 名前:nobodyさん [2009/09/10(木) 01:32:15 ID:tlO5UesG]
print SYU "<body>\n" ;
print SYU "<table border>";
print SYU "<tr>";
print SYU "<td width=25%><b>役・備考</b></td>";
print SYU "<td width=75%><b>セリフ・ト書き</b></td>";
print SYU "</tr>";
print SYU "<tr>";
print SYU "<td width=25%><b>@name</b></td>";
print SYU "<td width=75%>@naiyou</td>";
print SYU "</tr>";
print SYU "</table>";
print SYU "</html>";
close(SYU);
長文申し訳ありませんでした

10 名前:nobodyさん mailto:sage [2009/09/10(木) 02:41:05 ID:???]
最初の open のセミコロン

今回はエラーとして出んかもしらんが、今後のためにも面倒でも use strict してくれ

それから文字列を比較するときは == じゃなくて eq な
特に空文字かどうかの比較は

$hoge eq '';
$hoge ne '';
みたいに書く癖をつけたほうがいい



11 名前:nobodyさん mailto:sage [2009/09/10(木) 03:07:22 ID:???]
open(FILE, "<$file")に ; が無い

12 名前:nobodyさん [2009/09/10(木) 07:34:56 ID:xEU2hsmO]
>>10-11さん
ありがとうございます。今はちょっとPCを開く時間がないので無理ですが、学校で修正したいと思います。
こんな初歩のミスだとは…
もっと頑張らなきゃいけませんね
本当にありがとうございました。

13 名前:12 [2009/09/11(金) 00:27:02 ID:j5Qgkl9c]
修正したんですが、まだ駄目でした。コードは変わってないです。
whileあたりに何か問題があるみたいなんですが、わからないです。

14 名前:nobodyさん mailto:sage [2009/09/11(金) 00:39:31 ID:???]
駄目でしたじゃなくて、○○なので駄目でしたとした方がいい。
今後全てにおいて。

15 名前:12 [2009/09/11(金) 00:48:46 ID:j5Qgkl9c]
すいません。
お二方が教えてくださったとおり変えてみたところ500エラーは出なくなったんですが、
出力したHTMLに中身が残らず、name.logもnaiyou.logも空のままでした。
while($ln = <FILE>){
#$ln =~ s/\n/<br>/g;
#$ln =~ s/$split/$split<b>/g;
#$ln =~ s/(//g;

#($name, $naiyou) = split(/$split/, $ln);

#if($naiyou eq '')
#{$name = $naiyou ;
#}
#unless($name eq ''){
#$naiyou = "$naiyou</b>";
#}


open(OUT,"> name.log");
print OUT "$ln";
close(OUT);
open(PUT,"> naiyou.log");
print PUT "$ln";
close(PUT);

close(FILE);
}
にまでしても上手くいかなかったのでwhile部分の問題だと思ったのですが、何がおかしいのでしょうか?

16 名前:12 [2009/09/11(金) 00:50:24 ID:j5Qgkl9c]
↑上手くいかなかったではなくどちらの.logも空のままだった
です。

17 名前:nobodyさん mailto:sage [2009/09/11(金) 10:04:31 ID:???]
while 内部で close(FILE); してるよ。

18 名前:nobodyさん mailto:sage [2009/09/11(金) 10:55:18 ID:???]
>>15
whileループが必ず1回で終わりますね。close(FILE)しているから。
open(OUT,"> name.log");

open(PUT,"> naiyou.log");
はopenに失敗しても、そのまま無視されて処理が進むので、エラートラップするのが鉄則です。
すなわち、
open(OUT,"> name.log") or die $!;
open(PUT,"> naiyou.log") or die $!;
など。$!は最後のエラーメッセージが格納される特殊変数です。
よくあるのはパス違い、書き込みパーミッションが立っていないなど。

そもそも、
open(FILE, "<$file");
が失敗している可能性もあり。それだとwhileループは実行されていないことになる。

19 名前:12 [2009/09/12(土) 02:32:58 ID:83ZTZfsA]
openは成功してました。一行だけ読み込んだら問題なく表示されたので。
そういえば、splitってデミリタがその対象になる文字列内になかったらどうなるんですか?

20 名前:12 [2009/09/12(土) 02:36:32 ID:83ZTZfsA]
あ、わかりました。
すいません。
パスも、書き込みもあってて、openできてて、コードチェックも問題なく通るのに出来ないんです。
while($ln = <FILE>)
という記述が問題になる可能性はありますか?



21 名前:12 [2009/09/12(土) 03:10:26 ID:83ZTZfsA]
度々すいません。
やっと解決しました。
全部処理は上手くいっていたのですが、openの後ろが>だったために、書くたびに内容を上書きしてしまい、
最後の行の\nだけが書き込まれるという形になっていたみたいです。
助言してくださった皆さん、本当にありがとうございました。
いつか自分ももっと精進して皆様のように初心者に優しく教えられるようになりたいと思います。

22 名前:nobodyさん mailto:sage [2009/09/12(土) 03:26:39 ID:???]
>>21
とりあえず100年ROMしてろ

23 名前:nobodyさん mailto:sage [2009/09/12(土) 09:20:58 ID:???]
> とりあえず100年ROMしてろ

ROM 期間中に死を迎えることになりそうなので、軽減してもらえませんか

24 名前:nobodyさん mailto:sage [2009/09/14(月) 10:33:35 ID:???]
>>23
誰も来なくて暇だから明日まででいいよ

25 名前:nobodyさん [2009/09/14(月) 11:59:40 ID:t5y5v7j/]
くだ質の方にしようかと思いましたが、こちらで投稿致します。

perl -pe "s/foo/bar/g" *.txt

これをスクリプトで書くにはどうしたらよいのでしょうか?
以下のように書くと、0バイトファイルが出来上がります・・・

opendir DH,$dir or die;
my @files = readdir DH;
closedir DH;

foreach my $file(@files){
next if $file =~ /^\.{1,2}$/;
open(FH,"+>$file");
while(my $ln = <FH>){
$ln =~ s/foo/bar/;
}
close FH;
}

よろしくお願いします。

26 名前:nobodyさん mailto:sage [2009/09/14(月) 12:28:27 ID:???]
>>25
perldoc.jp/docs/perl/5.10.0/perlrun.pod#item__b__p__b___p

while (<>) { s/foo/bar/g } continue { print or die "-p destination: $!\n" }

本当にやりたい事には -i オプションが抜けてる気がするけどね

27 名前:nobodyさん mailto:sage [2009/09/14(月) 13:03:07 ID:???]
>>25
opendir my $dir_fh, "." or die $!;
my @files = grep { (not /^\./) and -f } readdir $dir_fh;
closedir $dir_fh;

for my $file (@files) {
open my $fh, "+<", $file or die $!;
my @contents = map { s/foo/bar/; $_ } <$fh>;
seek $fh, 0, 0;
print {$fh} @contents;
}
やってみたいことと違うかもしれないけど

28 名前:nobodyさん mailto:sage [2009/09/14(月) 13:58:11 ID:???]
>>27 barの部分に入る文字列がfooの部分に入る文字列より短いと変なことになったので訂正
opendir my $dir_fh, "." or die $!;
my @files = grep { (not /^\./) and -f } readdir $dir_fh;
closedir $dir_fh;

for my $file (@files) {
open my $in, $file or die $!;
my @contents = <$in>;
close $in;
open my $out, ">", $file or die $!;
print {$out} map { s/foo/bar/; $_ } @contents;
close $out;
}


29 名前:nobodyさん [2009/09/14(月) 14:27:32 ID:t5y5v7j/]
>>26-28
ありがとうございます。
バックアップいらないから、と思いきや、上書自体-iが必要だったのですね・・・・確認不足でした。
>>26を参考に、上書ができない状態で90分ほど彷徨っていますが、これから>>27-28を試してみます。
お礼ついでに経過報告まで・・・

30 名前:nobodyさん [2009/09/14(月) 14:45:14 ID:t5y5v7j/]
>>28
出来ました!
しっかり噛み砕いて、自分の物に致します。
ありがとうございました。




31 名前:nobodyさん mailto:sage [2009/09/14(月) 18:22:59 ID:???]
一応書いとく。
ワンライナーが本来どう解釈されるかを見るには、B::Deparseを使う。

% perl -MO=Deparse -i.bak -pe "s/foo/bar/g" *.txt
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
 s/foo/bar/g;
}
continue {
 print $_;
}
-e syntax OK

そのまま必要部分をコピペしたらスクリプトの出来上り。



32 名前:nobodyさん mailto:sage [2009/09/14(月) 20:02:28 ID:???]
html template で分離されたテンプレートのほうに、
php埋め込んで稼働出来るようにならないでつか?

html templateで完成された奴をphpでコーティングしたいんだけど・・

33 名前:nobodyさん mailto:sage [2009/09/15(火) 01:00:11 ID:???]
>>32
phpからsystem関数っぽい何かでHTML::Templateで生成された文字列を返すPerlスクリプト動かせばいけんじゃないの?
phpよく知らんけど

つーかそこまでやるなら最後までPerlで組めよって思う

34 名前:nobodyさん mailto:sage [2009/09/15(火) 12:51:30 ID:???]
phpがモジュール型なら
application/x-httpd-php返せばphpがパースしてくれないかな?

text/x-server-parsed-html返すとSSI動くからいけそうな気がする。


35 名前:nobodyさん mailto:sage [2009/09/15(火) 18:36:40 ID:???]
>>34
httpdの設定によるが、普通.phpファイルをパースするようになってるんじゃないか?

print $headers;
open(FH, '| /usr/bin/php');
print FH $php_code;

とかでいーじゃん。結果が欲しいならopen3で。

PHP::Interpreter

つー手もあるぞ。

36 名前:nobodyさん mailto:sage [2009/09/15(火) 18:55:27 ID:???]
.phpが処理されるのは
AddType application/x-httpd-php .php
ってして拡張子.phpのコンテントタイプはapplication/x-httpd-phpだよ
って設定してるからで
実際モジュールはコンテントタイプみてパースするか無視するか決めてる


37 名前:nobodyさん mailto:sage [2009/09/15(火) 19:21:35 ID:???]
>>36
だからそれはサーバーアプリケーション依存だろ?
断言すんな断言を。世の中全部Apacheとか思ってそうだな。
最近はスケールとかの問題で事情が変わりつつあるぞ。

38 名前:nobodyさん mailto:sage [2009/09/15(火) 22:21:14 ID:???]
はいはいよかったね

39 名前:nobodyさん mailto:sage [2009/09/15(火) 22:46:47 ID:???]
すみません、おそくなりました。
皆様助言ありがとうございます。

application/x-httpd-php を付加してやっても駄目でした。
ソースをみるとそのままコードが出てました。

PHP::Interpreter 試してみます。

40 名前:nobodyさん mailto:sage [2009/09/15(火) 23:34:35 ID:???]
10日でおぼえる Perl/CGI という本でperl/cgiを勉強しているのですがアクセスカウンターのサンプルCGIが動かず困っています。

CGIのソースは
1 #! c:/perl/bin/perl
2
3 # カウントファイルの読み込み
4 open(IN, "<./count.dat");
5 $count = <IN>;
6 close(IN);
7
8 ++$count;
9
10 # カウントファイルの書き込み
11 open(OUT, ">./count.dat");
12 print OUT $count;
13 close(OUT);
14
15 # サーバー出力
16 print <<END;
17 Content-type: text/html
18
19 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
20 <html>
21 <head><title>あくせすかうんたー</title></head>
22 <body>
23 <p>あなたは……$count番目の訪問者です。</p>
24 </body>
25 </html>
26 END
です。count.datはちゃんとCGIと同じディレクトリにおいてあります。
ファイルの読み込みはできるようなのですが、書き込みができないようです。
「あなたは……1番目の訪問者です。」と表示されてしまいます。 どうすればいいでしょうか?



41 名前:nobodyさん mailto:sage [2009/09/16(水) 00:43:06 ID:???]
手元で試す限りではカウントアップされる。
Ctrl+F5(俗に言うスーパーリロード)でも駄目なら
書き込み部分を
open(OUT, ">./_count.dat");
に変更して _count.dat がどこに作られるか確認したらどうかな。

42 名前:nobodyさん mailto:sage [2009/09/16(水) 00:59:33 ID:???]
>ファイルの読み込みはできるようなのですが
読んでなくても「1番目の訪問者です」になるけどね。

43 名前:40 mailto:sage [2009/09/16(水) 01:00:39 ID:???]
>>41
レスありがとうございます

open(OUT, ">./_count.dat");

に変更してみて、実行した後、検索をかけてファイルを探したりしましたが見つけることができませんでした。
もしファイルが無かったら新しく生成されるべきなんですよね?

あと参考書がwindows版apacheを使っているのですが、そのせいでしょうか?
ちなみに読み取り専用のチェックははずしてあります。

44 名前:nobodyさん mailto:sage [2009/09/16(水) 04:24:42 ID:???]
>>36
>>39
しかも嘘じゃねーか。まるで役に立たないってのはこのことだな。

45 名前:nobodyさん mailto:sage [2009/09/16(水) 04:28:29 ID:???]
>>43
CGI置いてるってーことは所有者はあなただよね?
CGIスクリプトは別の所有者で実行されるから、パーミッションの
可能性が高いね。生成されるはずのディレクトリに移動して

chmod . 777

してみ。マニュアルみてこのコマンドが何するものか理解してな。
普通はセキュリティとか考えて別のディレクトリ掘る性質のものだから。

46 名前:nobodyさん mailto:sage [2009/09/16(水) 04:29:36 ID:???]
あーcount.datが置いてあるなら、

chmod count.dat 666

だな。こっちの方が安全だし。

47 名前:40 mailto:sage [2009/09/16(水) 04:37:30 ID:???]
すみません
書き忘れました。自分もwindows版apacheを使っています。

48 名前:nobodyさん mailto:sage [2009/09/16(水) 04:58:27 ID:???]
>>47
だったら単に"count.dat"か".\count.dat"じゃないの?知らんけど。Perlが面倒みてくれるのかな。
それにWindowsのパーミッションがどうなってるのか知らんけどその辺くさい。

49 名前:nobodyさん mailto:sage [2009/09/16(水) 05:16:30 ID:???]
>>36
Apacheやlighttpdで試したが動くサーバーなんてなかったぞ。
知ったか君乙。つか迷惑だからレスすんな。

50 名前:nobodyさん mailto:sage [2009/09/16(水) 10:10:22 ID:???]
>>47
普通に動く。
エラーログには何か出てないの?



51 名前:40 mailto:sage [2009/09/16(水) 10:42:38 ID:???]
>>50

コマンドプロンプトだと動きました。

各種ブラウザ(Opera, Firefox, Google Chrome, IE)で試したんですがだめでした。
何ででしょうか?

52 名前:nobodyさん mailto:sage [2009/09/16(水) 11:56:01 ID:???]
ロックしてないし(この構造でロックしてもロックにならないけど)、
複数のプロセスが一度にアクセスして、ファイルが壊れてるとかなら考えられるけど。

まー、情報が少なすぎて、分からん。

53 名前:nobodyさん mailto:sage [2009/09/16(水) 12:03:46 ID:???]
キャッシュ表示してるだけじゃないの?
ランダムに変わる長さの文字列を表示させるようにしてみるか
IE なら CTRL+リロード、Firefox なら Shift+リロードしてみて

54 名前:40 mailto:sage [2009/09/16(水) 12:36:56 ID:???]
>>53
ランダムのヤツはもうやってあって、ちゃんとランダムに毎回変わりました。

windowsでactiveperl+apacheなんですが
activeperlとapacheはCDから本と同じバージョンだし、
httpd.confもCDからまんまコピーだし

もう何がなんだか

55 名前:nobodyさん mailto:sage [2009/09/16(水) 12:54:14 ID:???]
open(IN, "<./count.dat") or die "cannot open";
こうやって、ちゃんとファイルを開けてるかみるとか

56 名前:nobodyさん mailto:sage [2009/09/16(水) 13:02:45 ID:???]
ブラウザでのキャッシュ無視リロードはやったの?
複数提案があったら出来る限り全部試せよ

57 名前:40 mailto:sage [2009/09/16(水) 13:02:53 ID:???]
>>55

読み込みとして開くのはできてるようなんですけど

書き込みのときうまくいっていないようです

なぜかというとcount.datの中身を
11
にしとくと

ファイルを開いて値を読み込む

インクリメント

「あなたは……11番目の訪問者です。」

と表示されるからです。
ホント、なんででしょう。

58 名前:40 mailto:sage [2009/09/16(水) 13:06:24 ID:???]
まちがえました

「あなたは……12番目の訪問者です。」
ですね

>>56
やりました

59 名前:nobodyさん mailto:sage [2009/09/16(水) 13:08:15 ID:???]
エラーログ晒してみてよ
もうなんの情報もなしにこれでは辛い

60 名前:40 mailto:sage [2009/09/16(水) 13:12:53 ID:???]
>>59


apacheのerror.logのでいいんでしょうか?それともほかのperlとかのログでしょうか?
ごめんなさい 知識が少ないもので、わからないんです。



61 名前:nobodyさん mailto:sage [2009/09/16(水) 13:16:05 ID:???]
apacheのerror.log で OK

62 名前:nobodyさん mailto:sage [2009/09/16(水) 13:19:59 ID:???]

[Wed Sep 16 12:01:14 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: 127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: 127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: 127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: 127.0.0.1/tendays/3-3.cgi
[Wed Sep 16 12:01:15 2009] [error] [client 127.0.0.1] File does not exist: C:/ApacheGroup/Apache2/htdocs/favicon.ico, referer: 127.0.0.1/tendays/3-3.cgi

アイコンのエラーだけずっとです。count.datは引っかかりませんでした。
アンチウイルスソフトは止めてあるし、再起動は何度もしました。

63 名前:nobodyさん mailto:sage [2009/09/16(水) 13:24:08 ID:???]
use CGI::Carp qw(fatalsToBrowser);
use warnings;
use strict;

を2行目に追記してみて

64 名前:40 mailto:sage [2009/09/16(水) 13:26:06 ID:???]
Software error:
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 9.
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 12.
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 16.
Global symbol "$count" requires explicit package name at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 20.
Execution of C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi aborted due to compilation errors.

For help, please send mail to the webmaster (webmaster@localhost), giving this error message and the time and date of the error.

65 名前:nobodyさん mailto:sage [2009/09/16(水) 13:34:24 ID:???]
my $countにしたらエラー無く実行されました。

66 名前:40 mailto:sage [2009/09/16(水) 13:39:00 ID:???]
ですが、ブラウザで実行してもカウンタが回りません

67 名前:nobodyさん mailto:sage [2009/09/16(水) 13:42:03 ID:???]
_count.datが生成されなかった時点でもう根本的におかしいんだが。
CDからコピーしたということは、何らかのファイルがまだ読み取り属性になっている可能性があるな。
Apacheをインストールした*フォルダ*のプロパティを開いて、読み取り属性に灰色の「レ」がついて無いか確認。
スクリプトを置いているフォルダのプロパティを開いて、同様に確認。

あとは>>55を参考に、出力側も
open(OUT, ">./count.dat") or die "cannot open";
にして試してくれ。

エラーログに痕跡がなかったら↓をenv.cgiとかの名前で実行して、結果を貼ってもらうくらいしか無いかな。
#! c:/perl/bin/perl
print "Content-type: text/plain\n\n";
foreach (sort keys (%ENV)) {
print "$_: $ENV{$_}\n";
}

68 名前:40 mailto:sage [2009/09/16(水) 14:07:10 ID:???]
open(OUT, ">./count.dat") or die "cannot open";


Software error:
cannot open at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 16.

For help, please send mail to the webmaster (webmaster@localhost), giving this error message and the time and date of the error.

となりました。

env.cgiの出力結果は

COMSPEC: C:\WINDOWS\system32\cmd.exe
DOCUMENT_ROOT: C:/ApacheGroup/Apache2/htdocs
GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
HTTP_ACCEPT_CHARSET: iso-8859-1, utf-8, utf-16, *;q=0.1
HTTP_ACCEPT_ENCODING: deflate, gzip, x-gzip, identity, *;q=0
HTTP_ACCEPT_LANGUAGE: ja-JP,ja;q=0.9,en;q=0.8
HTTP_CONNECTION: Keep-Alive, TE
HTTP_HOST: 127.0.0.1
HTTP_REFERER: 127.0.0.1/tendays/
HTTP_TE: deflate, gzip, chunked, identity, trailers
HTTP_USER_AGENT: Opera/9.80 (Windows NT 5.1; U; ja) Presto/2.2.15 Version/10.00
PATH: C:\Perl\bin\;C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\;C:\Program Files\Borland\BDS\4.0\Bin;C:\WINDO
WS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\ATI Technologies\ATI.ACE\Core-Static;C:\tex\
bin;C:\gs\gs8.70\bin;C:\gs\gs8.70\lib;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Serv
er\100\DTS\Binn\;C:\Program Files\QuickTime\QTSystem\

次に続く

69 名前:nobodyさん mailto:sage [2009/09/16(水) 14:07:53 ID:???]
PATHEXT: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
QUERY_STRING:
REMOTE_ADDR: 127.0.0.1
REMOTE_PORT: 3349
REQUEST_METHOD: GET
REQUEST_URI: /tendays/env.cgi
SCRIPT_FILENAME: C:/ApacheGroup/Apache2/htdocs/tendays/env.cgi
SCRIPT_NAME: /tendays/env.cgi
SERVER_ADDR: 127.0.0.1
SERVER_ADMIN: webmaster@localhost
SERVER_NAME: 127.0.0.1
SERVER_PORT: 80
SERVER_PROTOCOL: HTTP/1.1
SERVER_SIGNATURE: <address>Apache/2.0.54 (Win32) Server at 127.0.0.1 Port 80</address>

SERVER_SOFTWARE: Apache/2.0.54 (Win32)
SYSTEMROOT: C:\WINDOWS
WINDIR: C:\WINDOWS

でした。

70 名前:nobodyさん mailto:sage [2009/09/16(水) 15:10:05 ID:???]
>cannot open at C:/ApacheGroup/Apache2/htdocs/tendays/3-3.cgi line 16.
やっぱり出力ファイルがopen出来てないな。
しかしそれが何故かというと、他のアプリにファイルハンドルを独占されているか、
書き込み禁止属性になっているとしか考えられないんだが。うーん・・・。

環境変数には問題は見当たらないね。



71 名前:nobodyさん mailto:sage [2009/09/16(水) 15:26:41 ID:???]
>>51でコマンドプロンプトからだとカウントアップされるということだから
ファイルが書込み禁止になっているわけじゃないんだよな。
あとはApacheの設定くらいか。

72 名前:nobodyさん mailto:sage [2009/09/16(水) 15:29:08 ID:???]
>>40
open(OUT, ">./count.dat") or die $!;
としてみて、失敗した原因を捕捉するのは鉄則。
openは失敗しても致命的エラーにならない(そのまま処理が進んでしまう)。
CD-ROMのファイルをコピーして使っているなら、read-only属性が付いているとしか考えられん。
読めもしないならパスの問題もあったかも知れんが。

73 名前:nobodyさん mailto:sage [2009/09/16(水) 21:51:49 ID:???]
コマンドプロンプトで
attrib -s -h -r count.dat
ってやって、データファイルの属性変更してみて

74 名前:40 mailto:sage [2009/09/16(水) 22:47:43 ID:???]
みなさん

apache2.0系の最新版を入れたら直りました。

いろいろとご迷惑をおかけし、またたくさんの返答ありがとうございました。

75 名前:nobodyさん mailto:sage [2009/09/16(水) 22:57:57 ID:???]
まぁApache側の何かがRead Onlyな所為なのだろうなとは思っていたよ
真相は闇の中だが

76 名前:nobodyさん mailto:sage [2009/09/18(金) 13:08:12 ID:???]
LWP で GET するときって、取得中のファイルってオンメモリなんですか?
もし一時ファイルに保存されているなら、その場所の調べ方と変更の仕方って提供されてるんでしょうか?

10分ぐらいググってみたけど見つかりませんでした

77 名前:nobodyさん mailto:sage [2009/09/18(金) 13:08:46 ID:???]
>>76
ソース読んだら?

78 名前:nobodyさん mailto:sage [2009/09/18(金) 18:38:19 ID:???]
>>76
一気読みもできるし、少しずつコールバック呼びながら読むこともできる。

79 名前:nobodyさん mailto:sage [2009/09/18(金) 18:41:26 ID:???]
>>77
> ソース読んだら?

その前にマニュアルを読め

80 名前:nobodyさん mailto:sage [2009/09/19(土) 13:40:04 ID:???]
Rubyだと配列の任意の位置から最後までを、[n..-1]で取り出せますが、Perlではどうするのでしょうか?

arr = [0, 1, 2, 3, 4]
p arr[2..-1] #=> [2, 3, 4]



81 名前:nobodyさん [2009/09/19(土) 14:16:15 ID:weAFKNKD]
perl CPAN モジュールのSutatistics::Suggestがインストールできなくて困っています。

ttp://search.cpan.org/~ihara/Statistics-Suggest-0.01/lib/Statistics/Suggest.pm
上記のサイトからlinux版ダウンロードして解凍し、以下の文を実行しようとしたのですが、

perl Makefile.PL [LIBS='-L/where/to/find/libsuggest.a -lsuggest']

解凍した中身に「Makefile.PL」がありません。また後ろに続く[LIBS='-L/where/to/find/libsuggest.a -lsuggest']もよく意味が分かりません。
よろしくお願いします。

<環境>
OS:Fedora9

82 名前:nobodyさん mailto:sage [2009/09/19(土) 14:40:29 ID:???]
>>80
0xcc.net/blog/archives/000043.html

83 名前:nobodyさん mailto:sagen [2009/09/19(土) 14:47:11 ID:???]
>>81
> 解凍した中身に「Makefile.PL」がありません。

「Linux版」の意味が不明だが、いずれにせよ、Makefile.PLはある。

また後ろに続く[LIBS='-L/where/to/find/libsuggest.a -lsuggest']もよく意味が分かりません。

"/where/to/find/"をlibsuggest.aをインストールしたディレクトリに置き換える。

84 名前:nobodyさん mailto:sage [2009/09/19(土) 15:03:34 ID:???]
>>82
ありがとうございます。
すごく参考になるサイトです。

でも自分の質問に対する答えは見つからないような。。。

85 名前:nobodyさん mailto:sage [2009/09/19(土) 16:52:19 ID:???]
>>80
my @arr = (0, 1, 2, 3, 4);
print @arr[2..$#arr];

または

my $arr = [0, 1, 2, 3, 4];
print @{$arr}[2..$#{$arr}];

86 名前:nobodyさん mailto:sage [2009/09/19(土) 17:01:18 ID:???]
>>80
print @a[5 .. $#a];

87 名前:nobodyさん mailto:sage [2009/09/19(土) 17:07:19 ID:???]
>>85-86
d
できました。

88 名前:81 [2009/09/19(土) 17:32:49 ID:02Qx22rD]
>>83
レスありがとうございます。win版等があったので・・・

「Makefile.PL」はありませんが、「Makefile」なら解凍した中にあります・・・
ttp://search.cpan.org/~ihara/Statistics-Suggest-0.01/
ここに、「Makefile.PL」があったので、これを利用しようと思います

[LIBS='-L/where/to/find/libsuggest.a -lsuggest']はこのまま実行しないで
自分の環境に合わせて変更する必要があるんですね。ありがとうございます

最後に「libsuggest.a」は、通常何処にあるのでしょうか?よろしくお願いします。

89 名前:nobodyさん mailto:sage [2009/09/19(土) 20:01:27 ID:???]
>>88
Linuxなんだろ?
find /usr -name libsuggest.a
で探せるだろ。最近は一瞬で全ファイルシステム探せるから便利だよな。
昔はこんなことしたら怒られる上に何十分もかかった。

っていうか
glaros.dtc.umn.edu/gkhome/suggest/download
から
suggest-1.0-linux.tar.gz
をダウンロードしたら、その中にlibsuggest.aがあるじゃん。これインスコすれば
いいんじゃねーの?README読んだらテスト方法書いてあるからテストしろよ。
テストは大事だからな。インスコ先は/usr/local/lib/辺りでいーだろ、で、

perl Makefile.PL [LIBS='-L/usr/local/lib/libsuggest.a -lsuggest']

こーだろ。

90 名前:nobodyさん [2009/09/20(日) 09:40:10 ID:WC9uameU]
他WEBの質問版でも書き込みさせて頂いておりますが、こちらでも質問させて頂きます
現在、初心者ながら、PerlでCSVファイルを使って簡易的なDBを作っています
その際、下記の方法でCSVファイルの部分修正していますが、うまくいきません><
申し訳ありませんが、お知恵をお借りできますでしょうか?
困っております(泣)

◆下記プログラム内容
 CSVを読み込み、一致する部分があればそこを修正し、新たなCSVとして書き出す

◆マスターDB(カンマ区切りのCSVファイルにて作成)
 ・DBは横230×縦max2000程度(現行は横200×縦100程度)
 ・先頭、横20までは日本語で、最大でも全角50文字程度(改行、カンマは事前に除外(置き換え)しています)
 ・その後は「1 or 空白」。(フラグが立っているか、いないかだけ)

◆発生する不具合?
 (1)修正箇所の後ろの2〜3行が、修正行の後ろにそのまま追加される(欠落する場合もあり)
 (2)DBの一番最後の最後の行に不明なデータが追加される
  例1:,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1
  例2:,,,,
  例3:0行目がコピーされる
  例4:改行のみ
 (3)上記、(1),(2)は基本的に同時発生
 (4)上記、(1),(2)が毎回ではなく時々発生(と言うか、かなり頻繁に… 10回に8回程…)

〜長文のため、私のソースは↓に書きます〜



91 名前:nobodyさん mailto:sage [2009/09/20(日) 09:44:13 ID:???]
>>90
まずやること。

その1、マルチをやめる
その2、もっと簡潔に記載する
その3、もっと勉強する

92 名前:90 [2009/09/20(日) 09:45:53 ID:WC9uameU]
#読み込み、及び修正
open (write_db,"+<db.csv");
flock write_db,2;
$i=0;
while(<write_db>){
@master = split(/,/, $_);
if( $master[0] == $data[0] ) {
$master[1] = $FORM{'textfield62'};
〜略〜
$master[15] = $FORM{'textfield5'};
#修正前の”1”のフラグ情報をクリア
for( $m = 21 ; $m <= $#master ; $m++ ){
$master[$m]=""; }
#修正情報の入っている@dataに基づいて@masterを変更(新しいフラグを立てる)
for( $k = 8 ; $k < $end_num ; $k++ ){
$master[$data[$k]] = 1; }
}
$write_data[$i] = join(',',@master);
$i++;
}
seek write_db,0,0;
close (write_db);

#書き出し操作
open (OUT,"+<db.csv");
flock OUT,2;
foreach my $ii ( @write_data ){
print OUT $write_data[$ii]; }
seek OUT,0,0;
close (OUT);

93 名前:nobodyさん mailto:sage [2009/09/20(日) 10:11:43 ID:???]
>>92
それ、DBD::CSVでできるから。CSVファイルに対して

SELECT * FROM table WHERE id > 1 ORDER BY id

とかできちゃうから。なんでそんなもの作ってるのか謎すぎる。

94 名前:nobodyさん mailto:sage [2009/09/20(日) 10:36:14 ID:???]
デバッグという概念も失われつつある

95 名前:90 [2009/09/20(日) 10:49:27 ID:WC9uameU]
>>93
理由があり、DBD::CSVは使えませんでした。
今後はそれも視野に入れ行っていきたいと思いますが、
まずはDBD::CSVを使わない場合での解決を目指しております。

>>94
実行時に修正前データ、修正後データ、書き込みデータの表示を行い
データ内容の確認を行っておりますが、その時点では問題はありません。
(CSVファイルとして書き出され、それをエディタ等で見た場合にデータがおかしくなっております)
上記に加え、確認する方法もご指摘頂けると幸いです。

96 名前:nobodyさん mailto:sage [2009/09/20(日) 11:16:04 ID:???]
>>95
>まずはDBD::CSVを使わない場合での解決を目指しております。
間違った判断だな。
理由って大した理由じゃないだろ。言ってみろ。自分でやってみたいとかそんなんだろ。
絶対これ直すよりDBI::CSVの方が早い。

このままじゃ無理。全面書き直し。
コードに定数が入れるな。機能をモジュールに分けろ。Test::Moreでテストを書きまくれ。

97 名前:nobodyさん mailto:sage [2009/09/20(日) 12:09:18 ID:???]
> 理由って大した理由じゃないだろ。言ってみろ。自分でやってみたいとかそんなんだろ。
> 絶対これ直すよりDBI::CSVの方が早い。
自分でやることの大切さは早いとか遅いとか関係ない、分かってないな。

98 名前:nobodyさん mailto:sage [2009/09/20(日) 13:11:31 ID:???]
本日は、弊店ガラガラ
----------------------------------------------------------------------

99 名前:nobodyさん mailto:sage [2009/09/20(日) 13:15:31 ID:???]
>>97
一度検討したくらいだから早さが大事なんだろ。
まあ確かに最近の風潮として、大したコードでもないのに
useが10〜20行くらい並んでるの見ると萎えるな。

100 名前:nobodyさん mailto:sage [2009/09/20(日) 13:19:29 ID:???]
テキストファイルはテキスト中に文字を
挿入しようとしても挿入にはなりません
上書きされるのが正常動作です


意味不明な文字が現れるのは、日本語
2バイトのうち1バイト分が上書き
されてしまうので



101 名前:nobodyさん mailto:sage [2009/09/20(日) 17:35:24 ID:???]
環境はWindows、使ってるのはActivePerl、文字コードはCP932とエスパーしてみる。
しかし、%FORMが謎。

とりあえず、Text::CSV_XSを使ってみて。

102 名前:nobodyさん mailto:sage [2009/09/20(日) 18:40:24 ID:???]
DBIが入ってない連鯖で使いたいとかじゃないの理由って

103 名前:nobodyさん mailto:sage [2009/09/20(日) 23:49:07 ID:???]
突っ込みどころ満載だが、デバッグの初歩、use strictを使ってコーディング!
ていうか、わざわざ"+<"でopenしているのに書き込む前にcloseしたら意味ないし!
seek FH,0,0;をcloseの直前に書いても無駄だし!
以前のデータを置き換えるなら、書き込むときのopenは">"で開く。さもなくば、closeせず、truncateする。
でないと、書き込んだ@write_dataの各要素のバイト長の合計が、書き込む前の
db.csvのファイルサイズより少ないとき、その差のバイト長だけ、以前のデータの末尾が残る!
不具合ってそのせいじゃないの?

104 名前:nobodyさん mailto:sage [2009/09/21(月) 00:29:33 ID:???]
いつも大漁ですね。

105 名前:nobodyさん mailto:sage [2009/09/21(月) 00:43:00 ID:???]
マスターファイルを読む「だけ」の所から根気良くやるしかないでしょ。
モジュールで済ませられるところはモジュールを使うと。
秘密が多すぎて、ダメかも分からんが。

で、釣りなの?

106 名前:nobodyさん mailto:sage [2009/09/21(月) 00:47:23 ID:???]
釣りとか大漁とか言ってるのは2ch初心者か?
質問スレでそんなの気にするな。

107 名前:nobodyさん mailto:sage [2009/09/21(月) 16:03:31 ID:???]
perlの中からRスクリプトを実行するスクリプトを作ってます。
以下の様に、Rスクリプトを一時的にファイルに落としてそれを実行すれば上手くRを呼び出せます。
ここで、一時ファイルを作らずに$r_script_strを直接使う方法はあるのでしょうか?

my $r_script_str = sprintf << 'EORS'
cat("Hello, world!")
EORS
;

open my $r_script_fh, '>', "./tmp_r_script.r";
print $r_script_fh $r_script_str;
close $r_script_fh;

system "R --vanilla --slave < ./tmp_r_script.r";


108 名前:nobodyさん mailto:sage [2009/09/21(月) 16:13:55 ID:???]
>>107
openでRに食わせればいい。

109 名前:107 mailto:sage [2009/09/21(月) 16:44:53 ID:???]
>>108
早速のレスありがとうございます。
一時ファイルを作らずにできるようになりました。

110 名前:nobodyさん [2009/09/25(金) 09:36:36 ID:wSkBdlIW]
どなたか詳しい方教えて頂けませんか
perl+MySQLで
$table_data[0]の真偽で分岐後、else{}は期待通りの結果ですが、if(){}が接続エラーとなってしまいます。
ど素人のため完全にはまってしまって

$dbh = DBI -> connect ($dns, $username, $password)
or
&err;
$sth = $dbh->prepare( qq{ SELECT code FROM client WHERE so = "$so" });
$sth -> execute()
or &err;
@table_data = $sth -> fetchrow_array();
$sth -> finish();
if(!$table_data[0]){
$sth = $dbh->prepare( qq{ UPDATE client SET condition=1 WHERE so = "$so" });
$sth -> execute()
or &err;
}
else{ $sth = $dbh->prepare( qq{ UPDATE client INNER JOIN afdb2 ON afdb2.code = client.code
SET afdb2.fix=afdb2.fix+client.price*100,
afdb2.occur=afdb2.occur-client.price*100,
client.condition=1 WHERE client.so = "$so" });
$sth -> execute()
or &err;
}
$sth -> finish();
$dbh -> disconnect();
exit;

よろしくお願いします。



111 名前:nobodyさん mailto:sage [2009/09/26(土) 11:16:39 ID:???]
> if(){}が接続エラーとなってしまいます。

って何なの? &err となっている部分を

$dbh->errstr;

に変更して、エラーの中身をはれ。

> $sth = $dbh->prepare( qq{ SELECT code FROM client WHERE so = "$so" });

プレースホルダ使いな。
SQLインジェクションするよw

112 名前:nobodyさん mailto:sage [2009/09/28(月) 04:42:47 ID:???]
MENTAっていうフレームワーク使いたいんだけど、本家サイトが落ちてるみたい
最新版のリファレンス的なものが置いてあるサイトとかブログないかな

113 名前:nobodyさん mailto:sage [2009/09/28(月) 11:00:48 ID:???]
本家というかYappoさんとこのcodereposにあるんじゃないの?

114 名前:nobodyさん [2009/09/28(月) 19:26:50 ID:MFzb2dw4]
どなたか詳しい方お教えください。
メールフォームを作ろうとしています。

form部品の、checkboxとradioとselectは、
textとかtextareaと違って、未選択の場合にキーを送信しないのですが、
これを未選択時にも、値が空のキー送信するようにすることはできますか?

cgi.pmのparam()メソッドでキーと値を受け取っているのですが、
上記が未選択時に受け取れないために、メールフォームの確認画面で、
つじつまが合わなくなってます(配列を使って自動的に生成しているため)。

どうかよろしくお願いします。

115 名前:nobodyさん mailto:sage [2009/09/28(月) 19:51:52 ID:???]
送られてくるキーが分かってるんなら、そのキーを defined で確認すりゃいいだけじゃないの?

116 名前:nobodyさん mailto:sage [2009/09/28(月) 20:04:40 ID:???]
>>115
早速のレスありがとうございます。
キーは分かってるんですが、それを毎回(メールフォームの項目が変わるたびに)Perlに記述していくのは面倒なので、
自動的にできないかと思って、メールフォームを作り直してます。

しかし、未選択のradioとかcheckboxのキーが送信されないという、
思わぬところでつまづいてしまいました。

117 名前:nobodyさん mailto:sage [2009/09/28(月) 20:16:08 ID:???]
考え方が、根本的に違っている気がする。

118 名前:nobodyさん mailto:sage [2009/09/28(月) 20:42:32 ID:???]
>>116
Perlとは直接関係ないけどさ、そうゆう場合はフォームのHTMLで、
全てのradioとかcheckboxにデフォルトの項目作って
checked="checked" とかしとくんじゃないのかな。

ただ、逆の使い方するほうが一般的な気がする。
例えば、必ず入れないといけないcheckやradioをあえて空にしといて、
そこをcheckしないと次のステップに進めないようにするとか、
"規約に同意「する」「しない」"で、「しない」にデフォルトでcheck入れとくとか。

これで、ある程度だけど自動スクリプトやロボットなんかの連投や、
一般ユーザーのボタン連打(いや、ほんとにいるんだって、極たまにだけど)
とかで、不意に高負荷になったりしないで済むし、なによりユーザーに
ちゃんとした入力を促すほうが大事かと思うが・・・。

119 名前:nobodyさん mailto:sage [2009/09/28(月) 20:47:50 ID:???]
sendmailで送信した宛先不明のメールをfromに指定したアドレスに返信したいのですが、
どのように設定したらいいのでしょうか? サーバーはlolipopです。

120 名前:114 mailto:sage [2009/09/28(月) 20:52:28 ID:???]
レスありがとうございます。

>>117
そうかもしれませんね。

>>118
おっしゃられることは分かります。

しかし、デフォルトでcheckedは設定してますが、checkboxやmultipleなselectは、
チェックを外すことができるんです(radioを除く)。

チェックを外すと、キー自体が送信されないので、
(キーをPerlに直接明示しない場合は)Perlでエラーを吐き出すことすらでません(JavaScriptでは可能ですが)。

PerlからメールフォームのHTMLを読み込んで、
nameを上から順に抽出して配列に代入する方法しかないかもしれませんね。



121 名前:114 mailto:sage [2009/09/28(月) 21:02:56 ID:???]
最終的に何がやりたかったかと言うと、Perl内の記述を一切いじることなく、
HTMLを変えるだけでメールフォームが簡単に作れるものを作りたかったんです。

そのHTML内の項目を読み取って、自動的にエラー画面・確認画面・自動返信メールが生成される感じです。
必須項目とか再入力が必要な項目とかもHTMLのみの変更で完結できるものです。

122 名前:nobodyさん mailto:sage [2009/09/28(月) 21:47:25 ID:???]
色々フレームワークをあたれば、そんなのもあるんじゃないか。
普通はデータベースのテーブルからフォームを起こすと思うけど。

123 名前:nobodyさん [2009/09/28(月) 22:09:35 ID:Abs+b0wT]
BBSのcgiについて質問です
海外からの書き込みを拒否にしたいです
多分このファイルがアクセスチェックのファイルだと思うのですが…
↓のプログラムで国内のみを通すにはどういじったら良いのでしょうか?
まだまだ勉強中なので指導していただけないでしょうか
よろしくお願いいたします

次レスにプログラムです

124 名前:nobodyさん mailto:sage [2009/09/28(月) 22:11:47 ID:???]
(^ω^)

125 名前:nobodyさん [2009/09/28(月) 22:13:49 ID:Abs+b0wT]
すみません、長すぎると出たので斧にあげました

ttp://www1.axfc.net/uploader/File/so/31637

126 名前:nobodyさん mailto:sage [2009/09/29(火) 00:16:08 ID:???]
>>116
スレちの希ガス。
毎回記述が面倒といっても、毎回記述するしかないのでは。
条件設定をするファイルを外部txtデータに書いておくとか。コード本体は変えないで済むように。
HTML::Parserなどを使って、htmlを丸ごと読み込んで、どんな入力項目があるかを解析するプログラムを外部で作ったらいかが。
htmlの中に条件指定をすると、いくらでも改ざんできてしまう。PCに保存してソースを書き替えて送信するとかできる。HTTP_REFERRERで確認しようにもクライアント側でどうとでも名乗れる。

>>119
envelopeアドレスを指定したらよろしい。
sendmailコマンドなら-fアドレス、Net::SMTPなら$smtp->mail(アドレス);
Mail::Sendmailならsendmail(Sender=>アドレス)のキーを渡すとセットされるみたい。

127 名前:nobodyさん [2009/09/29(火) 01:44:13 ID:l3KIzeZ6]
>>120のスクリプトに関するポリシーが間違ってるに一票。

>>118
チェックボックス外されたらアウトだし、
checkboxでF5回避できるとか、脳内で書いてるだろ。

> ちゃんとした入力を促すほうが大事かと思うが・・・。

チェックボックスのチェックを外すのはちゃんとした入力です。
で、キーは帰ってきません。

>>126
つYAML/JSON

パーサなんか使わなくても
perl -pe 's/</\n</g' foo.html | grep -i '\<input' | perl -ne '/<(?:input|select|textarea) [^>]*?\s+name=([^ >]+)/i; $M=$1 ; $M =~ tr/"//d ; print "$M\n";'

とかで充分じゃね?

渡された値のキーに依存するのは気持ち悪いというのは同意。

128 名前:nobodyさん mailto:sage [2009/09/29(火) 01:47:48 ID:???]
あ、grepいらねーな。print "$M\n" if $1でいけるかな?脳内ですまん。

129 名前:nobodyさん mailto:sage [2009/09/29(火) 01:50:43 ID:???]
ついでにtr/'\''"//dだし。これ以上修正するのめんどいからあとは任せた(誰に?)

130 名前:nobodyさん mailto:sage [2009/09/29(火) 02:05:25 ID:???]
結局ヒマだから書き直した。うざくてすまん。

perl -ln074e '/(?:input|select|textarea) [^>]*?\s+name=([^ >]+)/i; $_=$1 ;tr/'\''"//d;print if $1' foo.html



131 名前:nobodyさん mailto:sage [2009/09/29(火) 04:08:59 ID:???]
その辺はHTML::Formで取れるよ。

132 名前:nobodyさん mailto:sage [2009/09/29(火) 12:39:33 ID:???]
Module を作るのも手かもね

$form = HTMLFrom->new('POST', './test.cgi');
$form->setfield('hidden', 'action', '1');
$form->setfield('checkbox', 'sel', '1000');
$form->setfield('checkbox', 'sel', '1500');

ってやって、
$form->printform;
で表示するとか。

で、受け取りのときには
$form にはキーが保存されてるようにして、それを見れば一目瞭然みたいな感じ。



HTML::From がそうなのかもしれないけどw

133 名前:nobodyさん [2009/09/29(火) 19:44:30 ID:AG6/8zJV]
質問です。
$hogeにいろいろ含まれる<input type="text" name="iroiro" />のiroiroを
$q->param($1)に置換したいんですが可能でしょうか?($1はいろいろ変わります)

※$q->param($1)には、そのnameのvalueが入ってます。

while ($hoge =~ s/<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/$q->param($1)/s) {
}

こうやっても、当たり前ですが$q->param($1)が入ってるのでエラーになります。
でも、$value = $q->param($1)のようにしてから、その後の正規表現をどうすればいいのか分からないんです。
どうかお願いします。

134 名前:nobodyさん [2009/09/29(火) 20:00:59 ID:AG6/8zJV]
あ!すみません!できました!
while ($form =~ /<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/s) {
$value = $q->param($1);
$form =~ s/<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/$value/s;
}

135 名前:nobodyさん mailto:sage [2009/09/29(火) 20:09:10 ID:???]
>>133
$hoge =~ s|(<input.*?type=\"text.*?name=\")(.*?)(\".*?/>)|$1.$q->param($2).$3|egs;

- e (Eval) 修飾子 (modifier) を付けると、その中が「式」として解釈されます。
- g (Global) 修飾子 を付けると、何度でもマッチを繰り返します。

136 名前:nobodyさん mailto:sage [2009/09/30(水) 04:32:12 ID:???]
$qが気になるな。エスケープとかしとかなくていいのか。

137 名前:nobodyさん mailto:sage [2009/09/30(水) 12:15:20 ID:???]
>>136
つeオプション

138 名前:nobodyさん mailto:sage [2009/09/30(水) 16:57:25 ID:???]
ごめん、言葉が足りなかった。
$qがCGI.pmのオブジェクトだったら、XSS脆弱性に気をつけようってこと。
ただのお節介かも知れないけどさ。

139 名前:nobodyさん mailto:sage [2009/09/30(水) 19:03:47 ID:???]
ちょっとお尋ねします。

-環境
winXP IE8
AN HTTPD + perl 5.8.8 (active perl)
-----------
my $str = 'テスト';
print "Content-type: text/plain\n\n";
print $str;

IEの「ダウンロード出来ません」とかいうエラー発生
-----------
my $str = 'テスト';
print "Content-type: text/html\n\n";
print $str;

問題なし
-----------
もしかしてIE8ってtext/plain表示出来ないんでしょうか?

140 名前:nobodyさん mailto:sage [2009/09/30(水) 19:11:04 ID:???]
糞環境乙。
IE のせいにすれば解決すると思ってる?



141 名前:nobodyさん mailto:sage [2009/10/01(木) 04:28:26 ID:???]
AN HTTPD は棄てろ

142 名前:nobodyさん mailto:sage [2009/10/01(木) 09:22:24 ID:???]
いい加減Windows厨はAN HTTPDもActivePerlもゴミ箱に突っ込んで
CoLinux立てて環境作れ。サービス&自動起動にしてしまえば遠くにLinuxマシンが
あるのと全く区別がつかん。パフォーマンスもそっちのがずっと高い。
そろそろいい加減にしないと時代に取り残されるぞ。

ちなみに>>139のようなことで騒いでるやつが居たから見てやったら

Content-Type: text/plane

になってた。飛ぶ気か。

143 名前:nobodyさん mailto:sage [2009/10/01(木) 09:50:29 ID:???]
Windows環境でしか使わないしなあ。

144 名前:nobodyさん mailto:sage [2009/10/01(木) 10:58:18 ID:???]
>>139
ダウンロードしようとするのはIEの昔からの挙動だね。
確か512バイト未満はダウンロードするんじゃなかったかな。
リクエストするアドレスの最後にスラッシュをつければ回避できる。

IEは昔から問題を抱えてるブラウザだから、テストに使わない方がいい。
AN HTTPDも昔と変わってなければ問題を抱えてると思う。
設定が面倒だと思うだろうけど、Apache等で信頼性の高い環境を構築した方が
トータルで考えると楽だよ。

145 名前:nobodyさん mailto:sage [2009/10/01(木) 12:25:45 ID:???]
>>144
アドレスの最後にスラッシュ付けたら表示されました。
IEだと512バイト未満の不具合があるんですね。
Content-Type無視の方かなと思ってたんですが。

[無視できない]IEのContent-Type無視 − @IT
www.atmarkit.co.jp/fcoding/articles/webapp/02/webapp02a.html
2008/7/2 - Internet Explorer 8 のセキュリティ : 総合的な保護
msdn.microsoft.com/ja-jp/ie/dd218483.aspx
2008/9/3 - Internet Explorer 8 のセキュリティ Part VI: Beta 2 の更新項目
msdn.microsoft.com/ja-jp/ie/dd218497.aspx

AN HTTPDが古いっていうのも気になってたので
これを機にApache入れようと思います。
ありがとうございました。

146 名前:nobodyさん mailto:sage [2009/10/01(木) 12:28:42 ID:???]
IEって、昔、受け取ったデータの頭512バイトをちょんぎってしまう
バグがなかったっけか。あれの亜種かな?

147 名前:nobodyさん mailto:sage [2009/10/01(木) 12:44:02 ID:???]
$|=1
で解決出来たりねw

148 名前:nobodyさん mailto:sage [2009/10/01(木) 13:14:47 ID:???]
>>147
$|=1;
my $str = 'テスト';
print "Content-type: text/plain\n\n";
print $str;
$|=0;

これで使い方合ってますか?
これでもIEのエラーは変わりません。
Firefoxだと問題なく表示されます。

149 名前:nobodyさん mailto:sage [2009/10/01(木) 13:34:45 ID:???]
charset まで丁寧に指定してみては?

150 名前:nobodyさん mailto:sage [2009/10/01(木) 16:54:23 ID:???]
>>149
my $str = 'テスト';

#print "Content-type: text/html\n\n"; #OK
#print "Content-type: text/plain\n\n"; #NG
#print "Content-type: text/plain;charset=Shift_JIS\n\n"; #NG
print "Content-type: text/plain;charset=EUC-JP\n\n"; #NG

print $str;
#print "a" x 512; #NG
#print "a" x 1024; #NG
print "a" x 10240; #NG

charset指定しても変わらずです。
ついでに512バイト以上出力してもNGでした。
FirefoxはいずれもOK。
うちのIE周りがおかしいだけなんでしょうか?



151 名前:nobodyさん mailto:sage [2009/10/01(木) 18:10:20 ID:???]
>>150
my $str = 'テスト';
print "Content-type: text/plain; charset=Shift_JIS\n";
print "X-Content-Type-Options: nosniff\n\n";
print $str;

msdn.microsoft.com/ja-jp/ie/dd218497.aspx

IE8で、Content-typeに従わない機能が高性能化してるみたいだね。
Microsoftの製品だから、今度からは製造元のMicrosoftに聞いて欲しい。
IEに関わると不幸になるから。

152 名前:nobodyさん mailto:sage [2009/10/01(木) 18:27:00 ID:???]
これ試したらどうなる?うまく行ったApacheの出力そのままなんだけど。
3とか0とかは気にしないように。改行コードはCRLFで保存してね一応。

----------
#!/usr/bin/perl
print <<EOF;
Date: Thu, 01 Oct 2009 00:00:00 GMT
Server: Apache
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/plain

3
aaa
0

EOF

153 名前:nobodyさん mailto:sage [2009/10/01(木) 19:30:54 ID:???]
>>151
これで普通に表示出来ました。
ちょっとスレ違いになってしまって申し訳ないです。

皆さん、ありがとうございました。

154 名前:nobodyさん mailto:sage [2009/10/02(金) 00:57:54 ID:???]
質問が落ち着いたようなのでお伺いさせてください
>>123>>124はここではスレチなのでしょうか?
もしそうなら該当スレを教えていただけますでしょうか…

155 名前:nobodyさん mailto:sage [2009/10/02(金) 01:08:41 ID:???]
ここは自分でソース書く人のスレだから、確か改造スレみたいのなかったっけか。

156 名前:123 mailto:sage [2009/10/02(金) 09:02:45 ID:???]
>>155
ありがとうございます
改造スレを見つけたのでそちらでお伺いをたてます

>>123取消しします
お邪魔しました

157 名前:nobodyさん mailto:sage [2009/10/07(水) 14:00:07 ID:???]
知恵が足りないので教えてください。
フォルダ内のファイルの、連番が最大のものを別フォルダにコピーしようと思っています。

ファイル名は「@」で各要素が区切られているので、
foreach my $file(@files){
  my @fact = split /\@/,$file;
という風にして、連番=$fact[3]が最大のファイルを取得しようとしたのですが、
現在のコードはforeach{ max($fact[3]) }となっているので全く意味を為さず、
どこかで$fact[3]を配列に入れてやらないといけない事までは気付いたのですが、
その書き方がわかりません。

尚、$fact[0]と$fact[1]はキーボードからの入力で絞込み、$fact[2]に入る固有名詞は無視(というか、全て取得対象)でこの辺は上手く動いています。

よろしくお願いします。

158 名前:nobodyさん mailto:sage [2009/10/07(水) 14:33:21 ID:???]
>>157
有名なシュワルツ変換を使ってみてはどうでしょうか?

my @sorted_files =
map $_->[0],
sort { $b->[1] <=> $a->[1] }
map [$_, (split /@/, $_)[3]], @files;

my $target_file = $sorted_files[0];

159 名前:nobodyさん mailto:sage [2009/10/07(水) 14:48:08 ID:???]
>>157
別解
my $max=0;my $max_file;
foreach my $file(@files){
      $file=~/\@(\d+)$/;
      if($1>$max){$max_file=$file;$max=$1;}
}

160 名前:157 mailto:sage [2009/10/07(水) 17:53:04 ID:???]
>>158-159
ありがとうございます。
今日はちょっと手が出ないので、後日チャレンジしてみます。




161 名前:nobodyさん [2009/10/09(金) 20:37:40 ID:QHm3Fnkr]
中身が全て(先頭から末尾まで)半角英字である正規表現はどー書けば良いのでしょうか?

162 名前:nobodyさん mailto:sage [2009/10/09(金) 21:51:14 ID:???]
/^[a-zA-Z]+$/

163 名前:nobodyさん mailto:sage [2009/10/09(金) 22:59:18 ID:???]
ブログURLリストから大量のRSSフィードURLを拾う用事が生じました。
Feed::Findモジュールをついさっきインストールして試しに
www.geekpage.jp/programming/perl-network/feed-find.php
のコードをコピペして実行してみたら
[error] [client 127.0.0.1] Premature end of script headers
が…

どなたか原因が思い当たる方いらっしゃいませんか?

164 名前:nobodyさん mailto:sage [2009/10/10(土) 00:05:42 ID:???]
Apache(Web鯖上)で実行したなら、そのエラーの通りだろ。
コマンドラインからやってみ。

165 名前:nobodyさん mailto:sage [2009/10/10(土) 07:05:07 ID:???]
hogehoge.jp/test/archive/test3.html

こういった URL で、最後のファイルは CGI であったり HTML だったりするなかで
最後のスラッシュ以降の文字列を取得したいのですが、正規表現でどう書けば
いいのでしょう?

どう書いても最初の / から行末にしかマッチするものしか書けず、
Split で対応してるとこです

166 名前:nobodyさん mailto:sage [2009/10/10(土) 07:40:33 ID:???]
>>165
こんな感じかなー

m{[^/]+$}

167 名前:nobodyさん mailto:sage [2009/10/10(土) 11:35:43 ID:???]
もっと素直に書いたほうがいい

/.*\/(.*)/

最長マッチ使って .*/ と書くといちばん最後の / までにマッチするからそれ以降全部を取得すればいい

168 名前:nobodyさん mailto:sage [2009/10/10(土) 11:50:35 ID:???]
>>166の方が目的が明確で好きだな。

169 名前:nobodyさん mailto:sage [2009/10/10(土) 12:07:50 ID:???]
ベンチマークとったよ。ずれてたらごめんね。

          Rate >>165 >>166 >>167
>>165 119048/s    --  -53%  -69%
>>166 253165/s  113%    --  -35%
>>167 389105/s  227%   54%    --

というわけで、167が偉いという結論になりました。

170 名前:169 mailto:sage [2009/10/10(土) 12:09:42 ID:???]
補足しておくと、
僕も166のように書いてしまいがちです。
へぼコーダーです。
修行が足りない。



171 名前:nobodyさん mailto:sage [2009/10/10(土) 12:12:10 ID:???]
ちなみにコード
#!/usr/bin/local/perl
use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;

my $results = timethese(1000000,
    {'>>165'=>'my $url= "hogehoge.jp/test/archive/test3.html"; @_ = split("\/",$url); $_=$_[-1];',
     '>>166'=>'my $url= "hogehoge.jp/test/archive/test3.html"; $url=~m{[^/]+$} ; $_=$&;',
     '>>167'=>'my $url= "hogehoge.jp/test/archive/test3.html"; $url=~/.*\/(.*)/; $_=$1;',
    },'none');
cmpthese($results);
1行が長くてごめんなさい。

172 名前:161 [2009/10/10(土) 13:58:31 ID:viNfW09K]
>>162
ありがとうござます。

もう1つ聞きたいのですが、全部カタカナである文字列のマッチはどう書くのでしょうか?(文字コード:utf8)

173 名前:nobodyさん mailto:sage [2009/10/10(土) 14:26:26 ID:???]
>>169-171
追試。

#!/usr/bin/perl -w
use strict;
use Benchmark qw(cmpthese timethese);
my $url = $ARGV[0];
my $results = timethese(-5, {
  split => sub { my $file = (split qr|/|, $url)[-1] },
  match => sub { $url =~ m|^(?:.*/)?(.*)\z|s; my $file = $1 },
  rmatch => sub { $url =~ m|([^/]*)\z|s; my $file = $1 },
  replace => sub { (my $file = $url) =~ s|^.*/||s },
  substr => sub { my $file = substr $url, rindex($url, '/') + 1 },
}); print "\n";
cmpthese($results);

__END__

> perl test.script "example.jp/path/to/file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 6 wallclock secs ( 5.30 usr + 0.00 sys = 5.30 CPU) @ 725417.52/s (n=3843262)
replace: 6 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 2177060.73/s (n=11292414)
rmatch: 6 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 95000.19/s (n=497326)
split: 4 wallclock secs ( 5.16 usr + 0.00 sys = 5.16 CPU) @ 175469.36/s (n=904720)
substr: 5 wallclock secs ( 5.08 usr + 0.00 sys = 5.08 CPU) @ 3129401.38/s (n=15897359)

Rate rmatch split match replace substr
rmatch 95000/s -- -46% -87% -96% -97%
split 175469/s 85% -- -76% -92% -94%
match 725418/s 664% 313% -- -67% -77%
replace 2177061/s 2192% 1141% 200% -- -30%
substr 3129401/s 3194% 1683% 331% 44% --

174 名前:nobodyさん mailto:sage [2009/10/10(土) 14:28:02 ID:???]
> perl test.script "file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 6 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 720711.14/s (n=3862291)
replace: 6 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 5086089.07/s (n=26381544)
rmatch: 5 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 840637.43/s (n=4361227)
split: 6 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 285616.14/s (n=1503769)
substr: 4 wallclock secs ( 5.31 usr + 0.00 sys = 5.31 CPU) @ 3257009.79/s (n=17301236)

Rate split match rmatch substr replace
split 285616/s -- -60% -66% -91% -94%
match 720711/s 152% -- -14% -78% -86%
rmatch 840637/s 194% 17% -- -74% -83%
substr 3257010/s 1040% 352% 287% -- -36%
replace 5086089/s 1681% 606% 505% 56% --

> perl test.script "example.jp/l/o/n/g/l/o/n/g/l/o/n/g/p/a/t/h/t/o/file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 5 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 714051.59/s (n=3737346)
replace: 4 wallclock secs ( 5.25 usr + 0.00 sys = 5.25 CPU) @ 2172917.32/s (n=11405643)
rmatch: 5 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 63767.54/s (n=330826)
split: 4 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 85094.45/s (n=441470)
substr: 5 wallclock secs ( 5.03 usr + 0.00 sys = 5.03 CPU) @ 3018419.40/s (n=15185668)

Rate rmatch split match replace substr
rmatch 63768/s -- -25% -91% -97% -98%
split 85094/s 33% -- -88% -96% -97%
match 714052/s 1020% 739% -- -67% -76%
replace 2172917/s 3308% 2454% 204% -- -28%
substr 3018419/s 4633% 3447% 323% 39% --

175 名前:nobodyさん mailto:sage [2009/10/10(土) 14:48:50 ID:???]
>>172
decodeしてるなら、

/^\p{InKatakana}+$/

でいけるかもしれん。

176 名前:nobodyさん mailto:sage [2009/10/10(土) 15:08:34 ID:???]
>>165

正規表現で書くなら

m{[^/] (.+) \z}xms

jk


177 名前:nobodyさん mailto:sage [2009/10/10(土) 15:51:30 ID:???]
>>172
/^[ア-ン]+$/;

ちったあ試せばいいと思うよ

178 名前:165 [2009/10/10(土) 17:18:28 ID:ia/oAbqC]
>>166
>>167
>>176→(訂正っす) m{\z\/(.*)} ですよね?

ありがとうございます。

# 最長でマッチさせたあとに取得
$url =~ /.*\/(.*)/;

# / 以外が続く行末まで
$url =~ m{([^/]+$)};

# 最後に見つかった / より後ろ
# \z 文字列の最後にマッチする。(Perl5.005以降)
$url =~ m{\z\/(.*)};


/.*\/(.*)/ を使わせていただきます。


今思えば、正規表現が今より苦手なころは
「めんどくせーから、行頭から欲しい部分の直前までマッチさせて、その残りをマッチさせて得てた」
と思い出しましたw

個人的には \z もなかなかいい感じなので、\z の存在を覚えていきたいとこ・・・

179 名前:nobodyさん mailto:sage [2009/10/10(土) 18:16:02 ID:???]
>>177
おまえもちったぁ試したらどうだ。UTF-8のマッピングがどうなってるかとかさ。

180 名前:nobodyさん mailto:sage [2009/10/10(土) 18:23:47 ID:???]
>>179
ここ↓を見て本人が好きな範囲を選べばいいよね

ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_3000-3FFF



181 名前:nobodyさん mailto:sage [2009/10/10(土) 20:45:28 ID:???]
179が何にキレてるのか分からない

182 名前:nobodyさん mailto:sage [2009/10/10(土) 21:21:15 ID:???]
子供の頃、お菓子類をよく食べてると切れやすいという研究結果が出てたよね

183 名前:nobodyさん mailto:sage [2009/10/11(日) 02:16:07 ID:???]
>>181
ァヴヵヶの文字でコケるからだと思う。

184 名前:nobodyさん [2009/10/11(日) 03:03:33 ID:SfXKxhoo]
>>178
まとめ乙。
勉強になりました。

いまちょっと試せないけど、これはどうかな?

m|/(.*?)$|

ハテナは最短一致の修飾子だから、
たぶん動くと思うんだけど。

185 名前:nobodyさん mailto:sage [2009/10/11(日) 14:51:42 ID:???]
全体でマッチさせるように頭に".*"を付けるだけで速くなる。
しかし、単純な".*"が最速になるようにチューニングされてるのか、
>>167を超えられない。
文字クラスマンセーだったけど、考え直さないとだめかもダメだね。

186 名前:nobodyさん mailto:sage [2009/10/13(火) 19:54:24 ID:???]
use utf8とかしていなければ、正規表現使わないで書いたほうが速い気がする

それはそうと、URL末尾に/が来ないことは考えなくていいの?
read.cgi/とかco.jp/とか、サニタイズされてないhoge.html/.././とか。
他にも、用途によるけど、拡張子jpgのGIFでしたとか偽装したのは弾かなくていいの?

187 名前:nobodyさん mailto:sage [2009/10/13(火) 20:02:30 ID:???]
>>186
誤爆?
せめてレス番つけないと、何を誰に言ってるのか分からん。

188 名前:nobodyさん mailto:sage [2009/10/13(火) 20:22:13 ID:???]
超初心者ですが質問させてください。

メールアドレスの@の前のピリオドが付いているアドレスは、
正しくありませんとエラーが出るのですが、
正規表現?のエラーだと思うのですが、対処法がわかりません。

ネットで色々調べたのですが、文字列を追加するとか…
$mail_regexの後の文字列のどこに追加すればいいのでしょうか?
初歩的な質問で申し訳ないです。。環境はwindowsXPです。

189 名前:nobodyさん mailto:sage [2009/10/13(火) 20:45:03 ID:???]
エスパー1名様お呼びです

190 名前:nobodyさん mailto:sage [2009/10/13(火) 21:40:42 ID:???]
>>188
当方、エスパー度かなり高いほうですが、一つだけ質問させてください。
$mail_regexにどのような文字列が代入されているのか教えてください。



191 名前:nobodyさん [2009/10/13(火) 21:44:18 ID:pHeszieI]
>>188
$mail_regex = quotemeta($mail_regex);

192 名前:nobodyさん mailto:sage [2009/10/13(火) 22:26:16 ID:???]
>>188
ってか、RFC絡みの(メールサーバー側の)エラーじゃねえの、
ドコモ携帯宛てのメアドとか。

193 名前:nobodyさん mailto:sage [2009/10/13(火) 22:31:50 ID:???]
>>188
これでどうだ?

$mail_regex = 〜〜 . '|^[\w.-]+@(?:[\w-]+\.)+[\w-]+$';

194 名前:nobodyさん mailto:sage [2009/10/13(火) 23:40:03 ID:???]
本来、@ の直前に . がつくメールアドレスはメールの規格として正しくない。
だからエラーとして弾く処理は正しい。
しかしDoCoMoとauがこの規格外のメールアドレスを正しいものとして扱ってしまっているので話がややこしい。
ぶっちゃけDoCoMoとauは氏ね。
という前提知識が必要な話ですね。

195 名前:nobodyさん mailto:sage [2009/10/14(水) 00:25:09 ID:???]
DoCoMoもauもこれから新しく 〜.@〜 ってなるアドレスは取れなくなってるよ
まあ、今までに取ってるアドレスは有効なんだけどね

196 名前:nobodyさん mailto:sage [2009/10/14(水) 00:29:50 ID:???]
>>188
正規の規格はともかく、はじかなくていいピリオドをはじいちゃっているわけで、
$mail_regexに文字列を追加するんじゃなくて、文字列を変更する必要があると思われます。
ので、ここにその$mail_regex後の文字列を書いた方がいい。

197 名前:nobodyさん mailto:sage [2009/10/14(水) 01:29:31 ID:???]
188です。
皆様レスありがとうございます。

そうですよね。$mail_regexにどのような文字列が入っているかわからないと
答えようがないですよね…。
いま自宅なので書けないんです。なんせめちゃくちゃ長かったので…
申し訳ないです。

>>193さんが書いている文字列. '|^[\w.-]+@(?:[\w-]+\.)+[\w-]+$';を追加すると解決しますか?
管理システム側でのエラーなので、変更して解決しないと、恐ろしい事になる可能性があるんです 汗

198 名前:nobodyさん mailto:sage [2009/10/14(水) 02:14:04 ID:???]
エスパーして、Perlメモの正規表現だとしたら、
"foo."@example.net
みたいにダブルクォートすれば解決すると思う。

199 名前:nobodyさん mailto:sage [2009/10/14(水) 09:51:32 ID:???]
188です。
文字列を書いたのですが、本文が長すぎて書き込めなかったので、分けて書かせていただきます。



$mail_regex = '[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*
(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*
(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]
[^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*

200 名前:188 mailto:sage [2009/10/14(水) 09:56:21 ID:???]
すいません。。
長すぎてくじけました 汗
かなりのスレ汚しになってしまうので、やめておきます。
ありがとうございました。



201 名前:nobodyさん mailto:sage [2009/10/14(水) 10:44:33 ID:???]
codepadとか使やいいのに

202 名前:nobodyさん mailto:sage [2009/10/14(水) 22:18:23 ID:???]
いっそ尊敬するわ

203 名前:nobodyさん [2009/10/15(木) 18:04:11 ID:YQ/YK35J]
>>183
マジレスするとヶとヵはカタカナじゃない。箇の略字(个・ケ)が回りまわってそうなった。
一箇所→一ヶ所
ヶなのに「カ」と読むので、不思議に思った人が「ヵ」を使い出してそれも普及した。
ヶやヵを使う日本語のカタカナ語って存在しないだろ。

んで、UTF-8はuse utf8しないとメチャクチャになるし、旧来の正規表現(ァ-ン)だと「ー」や「ヴ」なんかを取りこぼすな。
\p{InKatakana}だろjk。

>>188
@の前に「.」が付いてるメールアドレスは正当じゃありません。アドレスの方が悪い。
プログラムのせいにすんな。

>>193
メアドの正規表現なめんな。>>199で短く書いた方だ。
www.din.or.jp/~ohzaki/mail_regex.htm#RFC

>>197
その正規表現自体、2chが文字変換する関係?か何かでコケるんだが、6行目の
(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]

(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*\.?@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]
に変更してみ。ものすごいクイックハックだが@の前に\.?を挿入してある。

204 名前:nobodyさん mailto:sage [2009/10/15(木) 18:09:09 ID:???]
>>197
あ、最後の行に対応する括弧がないな。まだ続きあるだろそれ。まあ多分>>203で間に合うからいいけど。

さらにInKatakanaの中にはしっかりヶとヵが入ってるんだな。まあ昔からマの間ではカタカナ扱いされてたけど。

205 名前:183 mailto:sage [2009/10/15(木) 18:59:55 ID:???]
>>204
マジレスすると、unicodeではカタカナ分類なんだ。
30F5 KATAKANA LETTER SMALL KA
30F6 KATAKANA LETTER SMALL KE

www.unicode.org/charts/PDF/U30A0.pdf

206 名前:nobodyさん mailto:sage [2009/10/16(金) 18:38:09 ID:???]
use Email::Valid::Loose;

207 名前:nobodyさん mailto:sage [2009/10/20(火) 12:41:02 ID:???]
each関数でリファレンスで受け取ったハッシュを引数にしてwhileに入れて使ったのですが一回もループせずにそのまま脱出してしまいました。
何故ですか?keys関数を使うとちゃんと値が返ってくるので中身がないことはないはずです。

208 名前:nobodyさん [2009/10/20(火) 12:57:20 ID:kwSavA/j]
earch(%{$chanko})

209 名前:207 mailto:sage [2009/10/20(火) 13:06:53 ID:???]
>>208
成る程、そうやって書くんですね!
解決しました、どうもです

210 名前:nobodyさん mailto:sage [2009/10/20(火) 20:18:27 ID:???]
こうしてエスパーたちは鍛えられていく



211 名前:nobodyさん [2009/10/20(火) 21:38:06 ID:kwSavA/j]
いや自分も初心者だから想像はついたw

212 名前:nobodyさん mailto:sage [2009/10/20(火) 22:24:14 ID:???]
初心者perlerは引かれあう・・・

213 名前:nobodyさん mailto:sage [2009/10/22(木) 06:34:07 ID:???]
えっとものすごい初歩的というかperlというものを知ったのが昨日なので
できるかどうかが知りたいだけなのですが、質問です
とあるCGIゲームでマクロというものを使うと楽という話を聞き、やってみようと思ったわけです
ですがどうも既存のツール等では上手くいかず、それならプログラムを自作してみようと思い立ったのですが
範囲内の色に反応して数をカウントしていくようにしたいのですが、こういうことは可能なのでしょうか?

214 名前:nobodyさん mailto:sage [2009/10/22(木) 07:51:32 ID:???]
とあるCGIゲーム、だけじゃ答えようがないような。
CGIゲームを提供する方なのか、それとも解く方なのか。
後者だとして、「CGIゲーム」といいつつ実はJavaアプレットだったりFlashだったりしそうな予感。
単純にHTMLを対象にどうこうするだけならJavaScriptが最適っぽい気がするが…たぶん関係ないな。

215 名前:nobodyさん mailto:sage [2009/10/22(木) 08:44:03 ID:???]
CGIゲームをプレイする側ですね
具体的に何をしたいのかは
画面内から特定の色を検出して、その出現回数をカウントしたあとに結果を表示するものなのですが・・・
特定の色の検出が調べてもわからなかったので質問してみたのですが・・・

216 名前:nobodyさん mailto:sage [2009/10/22(木) 09:06:31 ID:???]
死ぬ気で半年くらい頑張れば簡単にできるんじゃない?

217 名前:nobodyさん mailto:sage [2009/10/22(木) 11:24:40 ID:???]
なんでプレイする側の人間がPerlスレで聞いたんだ?

218 名前:nobodyさん mailto:sage [2009/10/22(木) 16:12:06 ID:???]
>>215
その「画面内の特定の色」がどうやって表示されているのかがわからなければ
そもそも解決できるかどうかすら答えようがないんでないかい。
どんなゲームなのか、CGIゲームってんだから具体的にURLを示した方が手っ取り早そうだが。

それ以前に「マクロ」から「Perl」へのつながりがすげえ謎。何故Perl。

219 名前:nobodyさん mailto:sage [2009/10/22(木) 16:52:20 ID:???]
要はオンラインゲーのチートツールを作りたいってことでしょ。
まあ、板違いだわな。

220 名前:nobodyさん mailto:sage [2009/10/22(木) 23:09:23 ID:???]
Win32::CaptureIEを使ってだな

後は画像解析だからPerlに限った話ではないな



221 名前:nobodyさん [2009/10/23(金) 11:34:54 ID:Y/3I6hzw]

クッキーを受け取って送信したいのですが、cookie_jar に保存されていません。
正確には、「#LWP-Cookies-1.0」のみが書き込まれる。
↓のコードで合ってますか?よくある原因などありましたら教えてください。

$ua = LWP::UserAgent->new;
my $cookie_jar = HTTP::Cookies->new(file => "./cookies", autosave => 1);
$ua->cookie_jar($cookie_jar);
$response = $ua->request($request);

なお、$response->contentは正常に取れてます。


222 名前:nobodyさん [2009/10/23(金) 12:35:26 ID:fdJYCoLf]
iframe とか JavaScript で cookie 発行されてたら、それも記録されないです

223 名前:221 [2009/10/23(金) 19:33:11 ID:Y/3I6hzw]
ソースを見る限りは、javascript や iframe でなんかやってるわけじゃ
なさそうです。googleアドセンスのjavascriptはあるけど・・・

224 名前:221 [2009/10/23(金) 20:02:16 ID:Y/3I6hzw]
すみません。
なぜか出来ました・・・一人でお騒がせしました。

225 名前:nobodyさん mailto:sage [2009/11/08(日) 11:49:33 ID:???]
SSIページ(index.shtml)に
<!--include virtual="〜">のタグを埋め込んでおき、
index.shtmlに携帯からアクセスしてきた際に
携帯用トップページにジャンプさせるCGIを作成しています。

index.shtmlファイルから(text/html)でヘッダ出力した後に
CGIから、Location:http://〜ヘッダを送信すると
うまくジャンプしません。

知りたいのは、
先にサーバーから出力された*.shtmlのヘッダを中止し、
新たに出力しなおす方法があれば知りたいのですが、
なにか良い方法はありませんでしょうか?

<meta>タグのURL転送での解決方法は一部の携帯キャリアが対応してないため使えません。

何か良い方法があればご教授願います。

226 名前:nobodyさん mailto:sage [2009/11/08(日) 12:31:27 ID:???]
CGI はどこから出てきたの?

227 名前:nobodyさん mailto:sage [2009/11/08(日) 12:41:39 ID:???]
トップページをcgiにする

228 名前:225 mailto:sage [2009/11/08(日) 14:26:09 ID:???]
>>226
配布されているものでなくて自作で作ってます。

>>227
index.shtmlをやめてindex.cgiを自作にすると
socket関数が使わないといけないことになるため、
面倒なことになるので避けたい感じです

あと、.htaccessでリダイレクトさせる方法も検討しましたが
.htaccessは、MIME設定とBASIC認証のみにしか利用できない
設定になっています

最後に、12万ファイルあるコンテンツなので
鯖の移転もちょっと。。ってな感じです(><)

229 名前:225 mailto:sage [2009/11/08(日) 14:52:59 ID:???]
今つくってるのは
こんな感じです

#!/usr/bin/perl
#キャリア振分
$ua = $ENV{"HTTP_USER_AGENT"};
if ($ua =~ /DoCoMo\/1\.0/i) { $CR='Docomo'; }
elsif ($ua =~ /(DoCoMo\/2\.0|FOMA)/i) { $CR='Docomo'; }
elsif ($ua =~ /^(SoftBank|Vodafone|J\-PHONE|MOT\-[CV])/i) { $CR='SoftBank'; }
elsif ($ua =~ /^UP\.Browser/i) { $CR='EzWeb'; }
elsif ($ua =~ /^(KDDI\-|OPWV|MMP)/i) { $CR='EzWeb'; }
else { $CR='PC'; }
#URL転送処理
if ($CR eq "Docomo") {
##ここでshtmlの出力ヘッダを取りやめたい##
print "Location: http://ドコモのURL";
} elsif ($CR eq "EzWeb") {
##ここでshtmlの出力ヘッダを取りやめたい##
print "Location: EzWebのURL";
} elsif ($CR eq "SoftBank") {
##ここでshtmlの出力ヘッダを取りやめたい##
print "Location: SoftBankのURL";
} else {
print "Content-type: text/html\n\n";
}
exit;


230 名前:nobodyさん mailto:sage [2009/11/08(日) 15:52:38 ID:???]
> 最後に、12万ファイルあるコンテンツなので
> 鯖の移転もちょっと。。ってな感じです(><)

そんな大切なコンテンツの運命を、こんな低俗な掲示板に求めていいのか?



231 名前:225 mailto:sage [2009/11/08(日) 21:01:31 ID:???]
>>230
そのうち11万8000ファイルはBBSから8年間かけて書き出された
ログファイルなので
そこまで、たいしたコンテンツでもありません。

2ch以外のフォーラム(4ヶ所ほど)でも聞いたのですが、
なかなか解決策が出てこなくて、こちらにも書込みしました。

232 名前:nobodyさん mailto:sage [2009/11/09(月) 09:27:28 ID:???]
CGIだとsocketを使わなければならなくて面倒というのが意味不明だな。
そんなことはないのでCGIでやれ。

233 名前:225 mailto:sage [2009/11/09(月) 13:23:21 ID:???]
index.cgiを作成した場合
「socket使う」=「面倒」 と書いた理由を述べます

index.shtmlに
@<!--include virtual="ナントカ.inc"> の記述が4ヶ所
A<!--include virtual="ナントカ.cgi"> の記述が9ヶ所

@は参照先がテキストなどので、open関数でクリアできる
Aを@の方法でやるとperlソースが流れ込んでくるので、socket関数で対応するか
または、参照先のCGIをテキストファイル書き出しにする。

ってな感じです。(><)

234 名前:nobodyさん mailto:sage [2009/11/09(月) 13:35:26 ID:???]
>>233
つLWP

いまどきそんなことのために生でsocketからコード書く奴はいねーよ。

235 名前:nobodyさん mailto:sage [2009/11/09(月) 13:39:54 ID:???]
>>233
次におまえは「私が使っているサーバにはLWPが入っていません」と言う

つーか死ぬまで苦労してろ...

236 名前:nobodyさん [2009/11/09(月) 14:11:03 ID:a1ezikgd]
質問です。CGIでsystem文を使って外部プログラムを実行します。 そのプログラムが終了まで数十分ほどかかる場合、実行の仕方や タイムアウトなどの処理はどのように組めばいいのでしょうか? 教えて下さい。

237 名前:nobodyさん mailto:sage [2009/11/09(月) 15:37:29 ID:???]
まさかと思うが共用レンタルサーバでやろうとしてないだろうね?
なら死ね。

ブラウザ側には実行(待機)中であることを示して、STDOUTを開放する。
その際SIDかPIDか何かから一意なIDを作っておく。
外部プログラムはforkかcronでバックグラウンド動作させる。
外部プログラムの実行状態はAjaxでもしくは普通にcgiで得られるようにする。シグナルを送れば何%処理中か返すように外部プログラムを作っておくと吉。

妄想だけど多分こんなもんだろ。

238 名前:nobodyさん mailto:sage [2009/11/10(火) 06:22:57 ID:???]
レン鯖のCGIの設定なら30秒ぐらいでプロセスがkillされちゃうから、どのみち無理。
ジョブキューを使うか、デーモン化した方がいいと思うけどな。

239 名前:nobodyさん mailto:sage [2009/11/12(木) 21:37:51 ID:???]
まー、何言ってもできない理由を探してくるだけだろ。

240 名前:nobodyさん [2009/11/16(月) 11:02:56 ID:D4PXiJWR]
ほっしゅ



241 名前:nobodyさん mailto:sage [2009/11/16(月) 20:59:19 ID:???]
cure っていうコスプレサイトでエラー画面出てた
spicky.net/vipper/uploads/spicky/9/5/8/1859_zeL8gI2.png
spicky.net/vipper/image/1859/

242 名前:nobodyさん mailto:sage [2009/11/17(火) 15:14:45 ID:???]
if(isset($_GET["url"])) readfile($_GET["url"]);
をPerlで書きたいのですが、どう記述したらいいものでしょうか?


243 名前:nobodyさん mailto:sage [2009/11/17(火) 16:15:15 ID:???]
PHPのreadlineとか激しく複雑なので完璧ではないが、
だいたいこんな感じかね?

use CGI;
use LWP::Simple;

my $q = CGI->new;
my $url = $q->param('url');
if (defined $url) {
get($url);
}

244 名前:nobodyさん mailto:sage [2009/11/18(水) 00:14:38 ID:???]
phpってそんな風に書くのか。cgi-lib.plの時代のperlみたいだな

245 名前:nobodyさん mailto:sage [2009/11/18(水) 14:54:08 ID:???]
>>244

246 名前:nobodyさん mailto:sage [2009/11/18(水) 23:48:59 ID:???]
tomcatのcgi-bin内でPerlを動かしているんですが、
ソケット通信ができません。
同じプログラムでapatheで動かすとソケット通信できます。

tomcatで何か設定が必要なのでしょうか

247 名前:nobodyさん [2009/11/19(木) 05:28:08 ID:ZQXO+cvV]
>>246
アクセスできるディレクトリやパーミッションに制約があるのでは?
匿名ソケットを使ってるなら知らんけど。

248 名前:nobodyさん [2009/11/19(木) 05:31:23 ID:ZQXO+cvV]
>>208
> earch(%{$chanko})

訂正しときますね。

each %$chanko


249 名前:nobodyさん [2009/11/19(木) 05:52:42 ID:ZQXO+cvV]
>>236
どう見たいかによる。
数十分かかってもライブで表示したいなら、サーバ(アパッチー?)のタイムアウト設定を十分長くする。
途中経過も見たいなら、ダブルフォークかなにかでバックグランドへ落としたあと
NPHかリダイレクトを使って、チェックした状態を表示。
ユーザが自由にアクセスできるようにするなら、確認用IDを発行するか、クッキーを食わせとく。

一番簡単な解決は、実行終了後に結果をメールで送りつけること。
もしくは結果表示用スクリプトのアドレスを送る。

250 名前:nobodyさん [2009/11/19(木) 15:05:03 ID:pgc2wImK]
useでモジュールをロードできなかった場合に対処するコードを書いています。
eval "use Hoge::Hoge"; if ($@) { use Hoge::Hoge2; }

ある程度うまくいくのですが、失敗する場合もあり、原因がわからずにいます。
まったく同じ内容でpackage名だけが違うモジュールでテストしてみると・・・
(内容は$nameの定義とエクスポートだけ)
Hoge/Hoge.pm -> package Hoge::Hoge;
Fuga/Hoge.pm -> package Fuga::Hoge;

[1] eval "use Hoge::Hoge"; #=>存在するので読み込まれる
[2] eval "use Fuga::Hoge"; #=>存在するのに$@がセットされる($@は空の様子)
※[1]と[2]は別々にテストしています。

[2]のエラーメッセージは
Global symbol "$name" requires explicit package name at ...
use strictをはずして警告を見てみると、
$nameを参照しようとしたときに次のメッセージが出ます。
Name "main::name" used only once: possible typo at ...

[2]の場合も通常にuseすると問題ありませんし、次も成功します。
BEGIN {
 eval { require Fuga::Hoge; Fuga::Hoge->import(); }; if ($@) { (略) }
}

[2]だけ失敗してるいまいち理由がわからないんですが、
どういう状況か見当つきますか?



251 名前:nobodyさん mailto:sage [2009/11/19(木) 15:09:31 ID:???]
もうすこしちゃんとソースをさらしてもらわないと説明だけでは
何をしてるのかわからん。

252 名前:250 [2009/11/19(木) 15:17:07 ID:pgc2wImK]
す、すみません。[2]のモジュールのソースは以下です。
package Fuga::Hoge;
our @EXPORT = qw($name);
use base qw(Exporter);
$name = 'myname';
1;

[1]はpackage名だけが違って、それぞれのパスに配置しています。
package Hoge::Fuga;

[1]は
eval "use Hoge::Fuga";
が評価されて$nameをimportできるのに、[2]だけ>>250の警告が出る状況です。
違いがわからないのと、メッセージの意味がじゅうぶん理解できなくて・・・

253 名前:250 mailto:sage [2009/11/19(木) 16:26:33 ID:???]
しばらく試しているのですが、どうも通常のuseと、evalした場合とでは
細かい違いがいろいろあるみたいです。
例えばモジュールでget_nameというサブルーチンをエクスポートしているとき、
通常のuseですと
my $name = get_name;
でOKですが、evalではエラーになったりするみたいです。
my $name = get_name(); #カッコがないとエラー

質問させてもらった件も、今ひとつつかみどころがない感じなので、
当面は安定を確認しているBEGINブロック内に記述する方法をとることにして、
尚、ドキュメントをあたってみたいと思います。

>>251さん、ありがとうございました。

254 名前:nobodyさん mailto:sage [2009/11/19(木) 16:40:34 ID:???]
見た感じ読み込まれるモジュールの方は問題なさげなので
[1]とか[2]とか言ってる読み込み側のプログラムもきっちり
さらしてもらわないとわからんな。

BEGINブロックをつかわないでuseをeval "use 〜" に置き換えると
読み込まれるにタイミングが変わるのでuse strictのコンパイル時
チェックに間に合わないというのはよくある話なんだが、全く同じで
片方だけおかしいとかいうことはないはずだしなんか違いがあるん
だろう。

255 名前:nobodyさん mailto:sage [2009/11/20(金) 16:12:32 ID:???]
if ($ENV{'REQUEST_METHOD'} eq "POST") {
 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
 @pairs = split(/&/,$buffer);
 for $pair (@pairs) {
 ($name, $value) = split(/=/, $pair);
 $value =~ tr/+/ /;
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 Encode::from_to($value, 'utf8', 'utf8');
 $in{$name} = $value;
}

のようなありきたりのフォーム取得構文を
enctype="multipart/form-data"
に対応させるために

use CGI;
my $query = CGI->new;
my $user = $query->param('user');
のような構文を使って

$in{'name'}=$value形式で受けとりたいのですが
どのように記述したらよいでしょうか?


256 名前:nobodyさん mailto:sage [2009/11/20(金) 16:45:27 ID:???]
>>255
use CGI;
my $query = CGI->new;
*in = $query->Vars();

257 名前:nobodyさん mailto:sage [2009/11/20(金) 17:56:52 ID:???]
>>256
ありがとう動いた

258 名前:nobodyさん mailto:sage [2009/11/20(金) 18:50:54 ID:???]
もうちょっとだけお付き合いください

フォーム側で
<input type="file" name="tempfile">としたものを

>>256 の方法で受け取り
open(SAVE,"> up.jpg");
binmode(SAVE);
binmode(STDOUT);
print SAVE $tempfile;
close(SAVE);
で保存すると、up.jpgというファイルの中身に
添付ファイルのバイナリでなく、
アップロードしたファイル名のみがテキストで記述されてました。

この場合は、$in{'tempfile'}の中身にはファイル名しか格納されていないことになります

enctype="multipart/form-data"の場合は別の変数になるのでしょうか?

259 名前:nobodyさん mailto:sage [2009/11/20(金) 19:46:05 ID:???]
>>258
こうすると、うまくいきます?

print SAVE $tempfile;

   ↓   ↓

print SAVE <$tempfile>;

260 名前:nobodyさん mailto:sage [2009/11/20(金) 21:19:20 ID:???]
てすと



261 名前:258 mailto:sage [2009/11/20(金) 21:42:40 ID:???]
>>259
ダメでしたorz
結果は同じでした

262 名前:258 mailto:sage [2009/11/20(金) 21:51:20 ID:???]
っしゃ!解決できました
調べてみたら、Varsとparamを両方つかわないといけないっぽいです

use CGI;
#データの取得 $in{'name'}で取得
if ($ENV{'REQUEST_METHOD'} eq "POST") {
 my $query = CGI->new;
 *in = $query->Vars();
}
#ファイルの取得
my $query = CGI->new;
$upfile= $query->param('tempfile');
#ファイルの書込
open(SAVE,"> up.jpg");
binmode(SAVE);
binmode(STDOUT);
while (read($upfile, $buffer, 1024)) {
 print SAVE $buffer;
}
close(SAVE);

263 名前:nobodyさん mailto:sage [2009/11/23(月) 03:37:20 ID:???]
 $a=x,$a=y,$a=z・・・それぞれの条件で動作分岐
させるとき、ifとelsifで書いていくのはなんか非効率的
のような。なんか方法あるのでしょうか?

264 名前:nobodyさん mailto:sage [2009/11/23(月) 05:58:26 ID:???]
何を持って非効率というのかわからん

あと、サンプルでも$a,$bは使わぬが吉

265 名前:nobodyさん mailto:sage [2009/11/23(月) 06:40:31 ID:???]
>>263
switchが欲しいってことだろ
Perlのバージョンが5.10以上なら

use feature qw/:5.10/;
given($a){
 when(x){…}
 when(y){…}
 …
}

と書ける

266 名前:nobodyさん mailto:sage [2009/11/23(月) 07:58:49 ID:???]
三項演算子使え。
$a =(条件1) ? 'x'
  :(条件2) ? 'y'
  :      'z'
  ;


267 名前:nobodyさん mailto:sage!stock [2009/11/23(月) 09:00:29 ID:???]
三項演算子って二者択一の時はよく使うけど、
長い式になると優先順位がわかりづらくて使いづらい。。。

268 名前:nobodyさん mailto:sage [2009/11/23(月) 09:19:12 ID:???]
>>263
5.10未満ならSwitchモジュールを

switch文
www2u.biglobe.ne.jp/~MAS/perl/waza/switch.html

269 名前:nobodyさん [2009/11/23(月) 09:35:35 ID:XYWla5BP]
連想配列に呼ぶべき関数へのリファレンスぶち込んじゃってる
ただこれをやると関数への引数は連想配列へのリファレンスにならざるを得ないから、あまりやらないけど・・・

270 名前:nobodyさん mailto:sage [2009/11/23(月) 10:26:54 ID:???]
>>269
こんな感じ?

my %func = ( foo => \&foo, bar => \&bar );

$func{foo}(1, 2); #=> 1 2 in foo

sub foo {
print "@_ in foo";
}

sub bar {
print "@_ in bar";
}

>関数への引数は連想配列へのリファレンスにならざるを得ない
これはどういう意味ですか?








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<95KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef