【Perl】初心者コーナー Part19
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/02/09 00:24ID:s0tpWWxg1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
あとは>>2-10。
0154nobodyさん
03/02/15 01:44ID:???0155nobodyさん
03/02/15 01:49ID:???設計レベルの話はこっちへ。
http://pc2.2ch.net/test/read.cgi/php/1041530204/
>>154
区別の付く人間が積極的に誘導 or 徹底的に無視すればいい。
0159nobodyさん
03/02/15 12:51ID:FZQxbA/5local($flags)=0;# NGキーワード追加
$s_mes = $in{'comment'};
foreach (split(/\s+/, $ng_word)) {
s/\*/\.\*/g;
if ($s_mes =~ /$_/i) { $flags=1; last;}
}
if ($flags) { &error("投稿エラーです。"); }# ここまで
なにか間違ってる記述がありますか?
0160エラーが出ます。
03/02/15 13:08ID:???0161nobodyさん
03/02/15 15:21ID:???文法的にはその記述は通る。みっともないけれど(w
あと、 >>160 の意味が分かるか?
ようするに何のエラーなんだよ。
で、「500 Internal Server Error と出ます」って応えたらそれ以降は放置だからな。
0162nobodyさん
03/02/15 16:59ID:FZQxbA/5どのようにエラー出ているか調べるにはどうすればいいのでしょうか。
Web上で実行させると500 ......と出る。これじゃ手かがりにはならないと言うのは分かるんですよ。
で、どのようにやれば詳細なエラーが出るのか分かれば・・・・・
0163nobodyさん
03/02/15 17:20ID:???http://pc2.2ch.net/test/read.cgi/php/1041530204/
0164nobodyさん
03/02/15 17:36ID:FZQxbA/5if ($s_mes =~ /$_/i)
で、 =~ で右の方で変数を使ったらだめっぽいんですが、そうなんでしょうか?
試しに =~ /NGキー/ と文字そのままやったら行けるんですが、
=~ /$ng_word/ だと駄目と言う事はわかりました。
変数を使うにはどうすればいいのでしょうか?
0165nobodyさん
03/02/15 18:21ID:???http://www.harukaze.net/~mishima/perl/cgi-debug-env/deb-tech.html
>>164
$s_mes =~ /$ng_word/i が駄目なのではない。
$ng_word の中身が問題だ。
joyful.cgi とやらがどんなスクリプトか知らんが、
ここに書いてある事が役に立つかも知れない。
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0166nobodyさん
03/02/15 18:38ID:nMMOQiZ6タグが使える
改行はbrをしなくても自動で認識
携帯対応のほうはすべて無効
同じログを取得
このような掲示板はどのようにすれば作れるのでしょうか?
考え方だけでも良いのでアドバイスお願いします。
0167nobodyさん
03/02/15 18:43ID:???タグをそのままに
改行コードを<BR>に置換
携帯対応の何を無効にしたいのか書かないとわからない
何と同じログを取得したいのか書かないとわからない
0168167
03/02/15 18:44ID:???0169nobodyさん
03/02/15 20:42ID:FZQxbA/5ご丁寧にありがとうございます。
ですが、解決しました・・・
index($in{'comment'},$ng_word).....と書く事で動きました。
0170nobodyさん
03/02/15 21:03ID:???1行につき50個の数値が,で区切られてい記録されているファイルが複数あります。
中身を読み込んで100個の数値(array1,array2それぞれ50要素)配列を返すsub read
を利用して数値を読み込みたいのですが、返ってくる数値のスマートな受け取り表記がわかりません。
どなたかご教授下さらないでしょうか。
($data[0],$data[1]....$data[99]) = &read("filename");
↑現状ではこのように書いています。
sub read{
open (IN,"<$_");
my @array1 = split(/,/,<IN>);
my @array2 = split(/,/,<IN>);
close (IN);
return (@array1,@array2)
}
なお、数値はそれぞれ10回程度計算で変更されたあとファイル再び書き込まれます。
0171nobodyさん
03/02/15 21:21ID:???> &read("filename");
ってエラーにはならないのか。
my @data = &read_file('filename');
sub read_file{
open (IN,'<$_');
my @array = split(/,/,<IN>);
close(IN);
return (@array,@array);
}
・・・参照で返した方がいいかなぁ。
それ以前に日本語が判らんなぁ(w
0173172
03/02/15 21:28ID:???170です。
0174nobodyさん
03/02/15 22:31ID:???http://pc2.2ch.net/php/SETTING.TXT
長文になるときはこちらを閲覧してみてください。
制限は2048文字になっていますね ニヤリ
0175nobodyさん
03/02/15 22:34ID:???0176nobodyさん
03/02/15 22:36ID:???それも違う。2048byteだ。
0177nobodyさん
03/02/16 01:27ID:IEb+jUgzhtmlからフォームの値をpostで送信して表示させたいのですが、
ローカル(ActivePerl、アパッチ使用)でやると対象CGIがテキストで表示され、
実際にサーバーにUPするとInternal Server Errorになります。
対象ソースの該当部分は以下のとおりです。
#!c:/perl/bin/perl
require'./cgi-lib.pl';
&ReadParse(*input_data);
$a = $input_data{'a'};
$b = $input_data{'b'};
$c = $input_data{'c'};
スレ違いでしたらすいません。
0178nobodyさん
03/02/16 01:50ID:???ローカル環境のActivePerlは使ったことないんで分からんが、
リモートサーバで、そのperlのパスではまず動かないね。
permissionも確認しれ。
あとprint "Content-type: text/html?n?n";などのヘッダの記述がない。
後は他でやれ。
0179nobodyさん
03/02/16 01:52ID:???print "Content-type: text/html\n\n";
require './cgi-lib.pl';
&ReadParse(*input_data);
0180nobodyさん
03/02/16 02:04ID:???外のサーバで動かしてたCGIをローカルにもってきました。
ローカル環境はWin2K+Apache2+ActivePeal5.8です。
Peal自体は実行できているんですが、(カウンターや掲示版の表示)
書き込みをしようとすると、反応しなくなってしまいます。
どうもPOSTのアクションをさせようとするとこうなってしまう
様なのですが、どうにも分からなくて、、、。
考えられる原因などお分かりの方いらっしゃったら
御指導ください。
タスクマネージャーでプロセスの確認をするとperlの占有率が98%
とかになってしまってるし、killしようとすると拒否されてしまいます。
0181177
03/02/16 02:06ID:IEb+jUgzさっきのは一部なので当然下のほうにはヘッダ記述等あります。
もちろんサーバーにあげる際はperlのパスは変えてます。
以下、さっきの残りです。
$c = $input_data{'c'};(ここまでは177の分)
print "Content-type: text/html\n\n";
print "<html>\n";
print "<body>\n";
print "$a&$b&$c<br>\n";
print "</body>\n";
print "</html>\n";
0183nobodyさん
03/02/16 02:23ID:???http://pc2.2ch.net/test/read.cgi/php/1014096840/309/
簡単な掲示板ソースでも見れ
0184nobodyさん
03/02/16 02:31ID:0jPHodHRどうすればよいでつか?
0185nobodyさん
03/02/16 02:42ID:???取りあえず
sudo kill -9
winで使えない関数とかなかったけ?flockとか...
perl5.8で動くように書かれてるの?
自分で書いたのじゃなければ、作者にフィードバックすれ。
んで、スレ違い。
0186
03/02/16 02:43ID:ah8+t8Vmcgi自体ちゃんと動いてるの?
#! /usr/bin/perl
print "Content-type: text/html\n\n";
print "ok \n";
は表示される?
これは
0188nobodyさん
03/02/16 02:46ID:???0189180
03/02/16 02:59ID:???>Peal
逝ってきます。
>>185
たしかに自分でかいたものではないので(書けません、、、泣)
ひとます、perlのヴァージョンの線で考えてみる事にします。
>>187
他のflock使っているcgiが動いているので、
ご指摘のとおりやはり違う問題のようです。
flockのような関数が他にあるといった事はないでしょうか?
0190nobodyさん
03/02/16 03:27ID:???ファイルロックで使われてる。
0191180
03/02/16 03:30ID:???先程質問させてもらったループのような症状にはならないものの
やはり書き込みが出来なかったので、もしかしたら
ApacheやWin2Kの設定の可能性もあると思うので、
そこらへんの板にも逝ってきます。
ありがとうございました。
0193177
03/02/16 12:34ID:e43KuLNCCGI自体は動いてます。
書いていただいたソースも問題なく表示されました。
0194nobodyさん
03/02/16 14:46ID:???@fname,@scorea,@average@scorej,@scoremにデータを入れた後、averageで
降順にソートしようと考えています。
下のようなソースで、エラーは出ないのですが、ソートしても順番が変わりません。
@fnameは文字列、それ以外は整数です。
Webなどを参考に独学でやっているので、基本的なはずかしいミスなのかも
しれないのですが、よろしくお願いします。forとかもうまく使えないし・・・
@results = (
[$fname[0],$scorea[0],$average[0],$scorej[0],$scorem[0]],
[$fname[1],$scorea[1],$average[1],$scorej[1],$scorem[1]],
[$fname[2],$scorea[2],$average[2],$scorej[2],$scorem[2]],
[$fname[3],$scorea[3],$average[3],$scorej[3],$scorem[3]]
)
@sortresults = map {$_->[0]}
sort {$b->[2] <=> $a->[2]}
map {[$_, split /,/]} @results;
その他、
@sortresults = sort { (split(/\,/,$b))[2] <=> (split(/\,/,$a))[2] } @results;
やreverse sortも試したのですが、結果は同じ(@resultsのまま)でした。
0195nobodyさん
03/02/16 15:43ID:???0196nobodyさん
03/02/16 15:49ID:???ってことね
0197nobodyさん
03/02/16 16:03ID:???@sortresults = sort { $a->[2] <=> $b->[2] } @results;
0198194
03/02/16 16:23ID:???できました!ありがとうございます。
昨日1日悩み続けて無駄にしてしまったのに、こんなに簡単なこととは・・・
あとは複数キーのソートにするだけなので大丈夫そうです!
本当に助かりました。
0199nobodyさん
03/02/16 18:40ID:???my $pid = fork;
die $@ unless defined $pid;
if($pid){
print "Content-type: text/html\n\n";
print "$pid:処理中です<br>";
local $eop = wait;
print "$eop:処理が終わりました<br>";
exit(0);
}
close STDOUT;
while(1){
last if $tmp > 10;
sleep(1);
$tmp++;
}
exit(0);
上記は、forkのテストコードで
ブラウザへの吐き出しを先に行い
後ろで重い処理というものを狙っているのですが
子供の処理が終わるまで、一切の吐き出しが行われません…
コード自体はこれで合っていますでしょうか?
環境はWin32上のApache1.3.27と
ActivePerl5.6.1build633です。
0200nobodyさん
03/02/16 19:24ID:???0202nobodyさん
03/02/16 20:05ID:6e2uXHNP0203199
03/02/16 21:09ID:???レスありがとうございます。
コマンドラインから実行してみるとうまくいくのですが、
ブラウザだと10秒後にやはりprintが実行されてしまいます。
close STDOUTをコメントアウトして実行してみたのですが
コマンドライン(成功)、ブラウザ(失敗)で
コメントアウト前と変わらずでした。
ちなみにperlへのパスは下記でしっかり通っております。
上記のソースからは抜いておきました。
#!c:\perl\bin\perl.exe
コードに問題がない場合、mod_perlやサーバの
バッファ関係の扱いの問題というのが想像できるのですが
この可能性はありますでしょうか?
0204200
03/02/16 22:30ID:???おっしゃる通り、バッファ関係と思われますが、サーバではなくクライアントサイドのブラウザの問題でしょう。
蛇足でした。。
0205200
03/02/16 22:45ID:???0207201
03/02/16 23:27ID:???いろいろ実験しましたが、windowsのApacheではなぜかバッファされるようです。
SendBufferSizeディレクティブもうまくいきませんでした。
LAN上のFreeBSD 4.6+Apache1.3.27で試してみた結果、
直接出力されました。Unixに移行する事で回避できそうです。
0209nobodyさん
03/02/17 01:06ID:???0210199
03/02/17 01:28ID:???なにやら手数をおかけしてしまったようで…
やっぱり環境上の問題なのですね。
生憎UNIXへ移行できるだけ環境にないのであきらめます。
でもコーディング自体、簡単なものですが
勉強になったので結果オーライです。
>>209
ためしにtelnetからGETしてみたら
変わらず同じ結果でした。
0211201
03/02/17 03:26ID:???>Windows 用の Apache バージョン 1.3 系では同期的な呼び出しが実装されています。
>このことは、バッファされていない結果が直ちにブラウザで見られないという
>CGI 制作者にとっては大きな問題の原因になります。
これっぽい。
0212nobodyさん
03/02/17 05:09ID:SDV2BVg0どうやって拡張子を変更すれば良いのでしょうか?
ただリネームするだけでは無理だったのでお願いします。
0213nobodyさん
03/02/17 05:35ID:???0214nobodyさん
03/02/17 05:36ID:SDV2BVg0perlで作成したexeを改造したいのですが…。
0215nobodyさん
03/02/17 05:58ID:???perlのプログラムをWindowsの実行ファイルにする方法ならある。
シェアウェアだがperl2exeってのがその1つ。検索してみ。
0216nobodyさん
03/02/17 06:01ID:???Perl2Exe
0217nobodyさん
03/02/17 06:04ID:SDV2BVg0ありがとうございました。
perlで作成されたexeの改造はどのようにして行うのでしょうか?
0219nobodyさん
03/02/17 06:10ID:???あとリネームして拡張子を変えても、周り(Windowsとか)の挙動が変わるだけで
中身は一緒でしょ。
0220nobodyさん
03/02/17 06:15ID:SDV2BVg0初心者なのでよくわからないです。
.plは.txtにリネームしたら改造できますよね?
perlで作成されたexeをplに戻してtxtで改造、再度txtからpl、exeとするのはできないのでしょうか?
0221nobodyさん
03/02/17 06:54ID:SDV2BVg0exeは改造できないみたいですね。
ありがとうございました。
0222nobodyさん
03/02/17 07:49ID:???もう少し勉強してから来て下さい
0223nobodyさん
03/02/17 11:56ID:80mgjnJ40224nobodyさん
03/02/17 13:32ID:4sj7P/C2exeに書き出す前のPerlスクリプトを改造すればいいじゃない。
0225nobodyさん
03/02/17 14:38ID:???0226nobodyさん
03/02/17 16:00ID:???たくさんのCGIで共通処理があったので、
init.pl っていうライブラリにその処理を格納しました。
そうすると、 times で得られる実行にかかる時間が
少し大きくなってしまう気がするんですが
これは気のせいですか?
require すると、時間がかかるのは仕様なんでしょうか
よろしくお願いします。
0227nobodyさん
03/02/17 16:18ID:???共通処理はサブルーチンにして、メインパッケージにのせたらどうでしょうか。
0230nobodyさん
03/02/17 18:08ID:???食い逃げの多い世の中、鏡だね
0231nobodyさん
03/02/17 18:18ID:???配布はされてるけど動かないなぁ。
というか、コードを読んだ限りじゃまだまだAlphaの段階で、
真面目にポータビリティを考える段階じゃないらしい。
VCでのコンパイルコードにperl57.libとかハードコーディングしてあるしね。
0233nobodyさん
03/02/17 21:03ID:Fb0RpjXG添付ファイル付きメールをフォームから送りたいと思い、
まず、formのENCTYPEを、'multipart/form-data'にしてみました。
こんな感じ
<FORM ENCTYPE='multipart/form-data' action='/cgi-bin/tenpumail.cgi' method='POST'>
すると、その後のINPUTで指定しているパラメータがわたってこないようなのです。
<inpit type=text name="onamae">
というようなパラメータが、いっこも渡って来ないのです。
ENCTYPE='multipart/form-data' をはずすとちゃんと渡ってきますが、
それではファイル添付ができないし…。
こう言ったことって良くあることなのでしょうか?
また、解決方法などありましたら、教えて頂けませんでしょうか。
0234203
03/02/17 21:10ID:Fb0RpjXG<inpit type=text name="onamae">
は
<inpit type="text" name="onamae">
の誤りです。すみません。
0236nobodyさん
03/02/17 21:20ID:???http://www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&c2coff=1&q=multipart%2Fform-data&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
まず検索しようね...
上から6コ目
0237233
03/02/17 21:24ID:???あ、ありがとうございました!
教えて頂いたところは見つけていたのですが、
回答にあるdecode.plを探さずに「だめか…」とへこんでいました。
探してみたらありましたので、もうちょっと調査してみます。
0239nobodyさん
03/02/17 21:44ID:???応用力無くても別にかまわないかと。
0240nobodyさん
03/02/17 21:51ID:4gk/zjjHどうも最新版のモジュールリポジトリに DB_File がないようなのですが、何か理由でもあるのでしょうか。
古い方のActivePerlのリポジトリにはあるようです。
0241236
03/02/17 21:53ID:???0242nobodyさん
03/02/17 22:33ID:1e74kzGJ0243nobodyさん
03/02/17 22:43ID:???0245nobodyさん
03/02/17 22:47ID:???http://pc2.2ch.net/test/read.cgi/php/1014357485/l50
0248nobodyさん
03/02/17 23:37ID:EIQogyxLmp3ファイルをopenしてprintしたら
バイナリがそのまんま文字化けしてブラウザに表示されてしまいました。
一応"Content-Type: audio/mpeg"は送っているのですが
やはり拡張子がmp3でないファイルは音声として扱ってもらえないのでしょうか?
やりたいのは、cgi要求に対してmp3のバイナリを返して
それをブラウザがmp3プレイヤーに渡して音楽を鳴らす。
というのを考えているのですが・・・・
0249nobodyさん
03/02/18 00:03ID:EDQzMDCwAPACHEのホームディレクトリにてCGIスクリプト置いたのですが、
属性を、711にしています
たとえばWWWダウンローダソフトで根こそぎもってかれると、このCGIも
もってかれるのでしょうか?
(CGIの中身はDBIにてPASSを入れちゃっていて思いました)
0251249
03/02/18 00:14ID:EDQzMDCw基礎的なものが無知ですいませんでした。。
(;´Д`)もうちょっと勉強して自分で調べてみまつ
0252nobodyさん
03/02/18 00:51ID:???audio/mp3
ってのはどぉよ?
しれでもダメなら、ちゃんとMP3ファイルを吐き出しているサイトへtelnetで接続してみて、
レスポンスのエンティティヘッダ「Content-type:」を調べてみる。
それでもダメなら、ブラウザが対応していないだけ。ファイルヘルパーの対応を設定してみる。
■ このスレッドは過去ログ倉庫に格納されています