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


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

くだすれPerl(超初心者用)2



1 名前:nobodyさん mailto:sage [2008/03/03(月) 05:07:32 ID:???]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。

298 名前:nobodyさん mailto:sage [2008/06/18(水) 01:19:02 ID:???]
sleep 1;

299 名前:nobodyさん mailto:sage [2008/06/19(木) 06:37:25 ID:???]
select undef,undef,undef,1;

300 名前:nobodyさん mailto:sage [2008/06/19(木) 10:35:29 ID:???]
$| = 1;

301 名前:うっとりハムちゃん [2008/06/20(金) 15:05:12 ID:nHevfWAE]
すいません、教えてください。

掲示板に書き込まれた内容に URLが含まれていた場合、
自動的にリンクになるようにしたいのですが、
簡単に追加する方法等がありますか?
よろしくお願いします。


302 名前:nobodyさん mailto:sage [2008/06/20(金) 15:20:25 ID:???]
URLかチェックして一致したらAタグ追加する。
正規表現 perl URL とかでググれば例が出てくると思う

303 名前:nobodyさん mailto:sage [2008/06/20(金) 22:01:17 ID:???]
>>301

$_ =~ s/([^=^\"]|^)(http\:\/\/[\w\.\,\~\-\/\?\&\+\=\:\@\%\;\#\%\*]+)/$1<a href=\"$2\">$2<\/a>/g;


304 名前:nobodyさん mailto:sage [2008/06/20(金) 22:29:00 ID:???]
…メタ文字じゃない文字をエスケープして意味あんの?
文字クラス中のエスケープは更に酷い。

305 名前:うっとりハムちゃん [2008/06/21(土) 03:14:25 ID:k6DOaEg8]
皆さんレスありがとうございます。
>303 さんの記述を一行足すだけではダメですよね?
例えば $comment 内に書き込まれた中から抜粋する際は
それを指定する必要などはありますか?


306 名前:nobodyさん mailto:sage [2008/06/21(土) 07:47:06 ID:???]
minibbsあたりのソースで見ましたね>余計なエスケープ



307 名前:nobodyさん mailto:sage [2008/06/21(土) 17:19:06 ID:???]
>>305
print &autolink($comment);

sub autolink {
my $text = $_[0];
$text =~ s{(s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)}{<a href="$1">$1</a>}g;
return $text;
}

参考: Perlメモ
www.din.or.jp/~ohzaki/perl.htm#httpURL

308 名前:うっとりハムちゃん mailto:sage [2008/06/21(土) 19:10:28 ID:???]
できました!!!
とても親切で、どうもありがとうございました!!
助かりました! m(_ _)m


309 名前:297 [2008/06/21(土) 21:40:03 ID:etCJxH2B]
遅くなりました。
ありがとうございました。


310 名前:nobodyさん mailto:sage [2008/06/23(月) 09:49:20 ID:???]
遅くなったのは、教わったとおりにsleepしてから書き込んだから

311 名前:nobodyさん mailto:sage [2008/06/23(月) 20:42:58 ID:???]
だれかボスケテ。

---post_data.cgi---
use CGI::Lite

#read(STDIN,$buff,$ENV{'CONTENT_LENGTH'});
$param = CGI::Lite->new()->parse_form_data('POST');

print "Content-Type: text/plain\n\n";
print "$buff\n";
for (sort(keys(%$param))){
    print "$_ = " . $param->{"$_"} . "\n";
}
つう、なんの変哲もないファイルを書いて、これに、

---test.js---
function reQuested_files( data,method,fName,async,callback){
    var r_obj = crHttpReq();
    r_obj.onreadystatechange = function(){
    if(r_obj.readyState == 4){ callback(r_obj); }
    }
    r_obj.open( 'POST','post_data.cgi',async );
    r_obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    r_obj.send( 'a=abcdeFG&b=123.4567&z=zzz' );
}

から、javascriptのXMLHttpRequest(所謂ajaxってやつ)でのPOST送信のテストをしたんだけども・・・、

312 名前:311 mailto:sage [2008/06/23(月) 20:43:29 ID:???]
これの戻り値を、
function callback_function(rs_obj){
    var res  = rs_obj.responseText;
    alert( decodeURI(res) );
}

で、alert表示させた場合の結果がおかしい。

具体的にゆうと、これでIEからの送信だと、alertに
a = abcdeFG
b = 123.4567
z = zzz

と、正確に(期待したとおりの)結果が返って来るんだが、最近出たばかりのFirefox3でやると、
結果alertになにも表示されない。

これjavascriptのせいかなと思って色々調べてみたんだが、まだはっきりとわからない。
けど試しに、上のレスのスクリプトで、コメントアウトしてる read() 部分を有効化させてやると、
どちらも同じ結果になる。(a=abcdeFG&b=123.4567&z=zzz)

つまりこれは、STDIN(POSTデータの実体)は入ってるのに、CGI::Lite->parse_form_data('POST')
で、なぜか狐3の時だけ、正常にパースされてない様なんだけど、どうなのかな? っと思って聞いてみた次第です。
(Web鯖のエラーログにも、値をParse出来ないみたいなerrorが出てました。)

これから、Javascript関係のスレにも行ってみようかと思うんですが、
とりあえず上記のPerlコードに、問題がないか確かめたかったんです。(問題ないですよね?)
ちなみに、htmlのフォーム上から、action="post_data.cgi" method="POST" で送った時は、IE,FFとも問題ありません。

313 名前:nobodyさん mailto:sage [2008/06/23(月) 22:23:59 ID:???]
スレチなきもするが、非同期通信の呼び出し方法はブラウザごとに違うよ。
つ prototype.js

314 名前:311 mailto:sage [2008/06/24(火) 05:32:07 ID:???]
>>313
ありがとうございます。そうなんですよ。
実はFF3リリース日に、別件でsync,ansyncについての挙動の違い(F1.5,2.0と3.0で)に遭遇しまして、
いろいろ調べてなんとかそちらの方は解消しました。今回のもやはり同様の理由かなぁ〜と思っていましたが、
原因判明しました。結論から言うと、javascript側だけの要因ではなく、Perl側にも原因があることがわかりました。
(割合は、とりあえず半々とゆうことにしときます。)

>>311の、post_data.cgiを、CGI::Liteだけでなく、CGI.pmにしてみたり、直でSTDINから読み込んだり、
同様のスクリプトをphpで実行したりして、原因突き止めました。

まず、IE6,7、Firefox1.5,2.0,3.0で、POSTしたデータそのものについては、1byteの違いもなかったんですが、
受け側により、処理の仕方に差異があるようでして、これの違いは、送り側の"Content-Type"にありました。

具体的には以下

315 名前:311 mailto:sage [2008/06/24(火) 05:38:53 ID:???]
送り側    ※     実際の送信されるリクエストヘッダ
IE 6       なし   (なにも無し)
IE 6       あり   application/x-www-form-urlencoded
IE 7       なし   (なにも無し)
IE 7       あり   application/x-www-form-urlencoded
FF 1.5    なし   application/xml
FF 1.5    あり   application/x-www-form-urlencoded
FF 2.0    なし   application/xml
FF 2.0    あり   application/x-www-form-urlencoded
FF 3.0    なし   application/xml; charset=UTF-8 ※1
FF 3.0    あり   application/x-www-form-urlencoded; charset=UTF-8 ※1
(※. setRequestHeader('...')の有無)
(※1.表示しているカレントページのcharsetに関わらず、UTF-8で固定のようです。)

316 名前:311 mailto:sage [2008/06/24(火) 05:48:29 ID:???]
モジュール  ヘッダ(#1)  パース(※)
CGI::Lite       なし    出来る
CGI::Lite       #2  出来る
CGI::Lite       #2 #8   出来ない
CGI::Lite       #3  出来ない
CGI.pm      なし    出来る(※)
CGI.pm      #2  出来る
CGI.pm      #2 #8   出来る
CGI.pm      #3  出来る(※)
Apache2::Reuest なし    出来ない
Apache2::Reuest #2  出来る
Apache2::Reuest #2 #8   出来る
Apache2::Reuest #3  出来ない
php(おまけ) なし    出来ない
php     #2  出来る
php     #2 #8   出来る
php     #3  出来ない



317 名前:311 mailto:sage [2008/06/24(火) 05:56:14 ID:???]
ずれまくりですいません。

>>315
については、一応RFCでは、フォームからの入力をPOSTする時には、必ず"application/x-www-form-urlencoded"
をヘッダに含めなくてはならないとなっております。
また、上記と似たような検証をしていたサイトがあって(といっても、そちらは1年ほど前の時点での調査でしたが)、
このようにブラウザごとに差異があるので、XHRでPOSTメソッドをリクエストをする時は、
setRequestHeader('application/x-www-form-urlencoded')が ”必須” になるとも書いてありました。
一応ここまでが、Javascript側の要因です。

>>316
Perlに関しては
#1 $ENV{'CONTENT_TYPE'}の値(ブラウザからのContent-Type リクエストヘッダ)
#2 application/x-www-form-urlencoded
#3 その他(text/plainなど)自前のLWPとHTTP::Request::Commonで、適当なリクエストヘッダをでっちあげて確認した。
#8 charset=UTF-8
※.一般的なデータ取得関数を使って、変数に値をセットできるかどうか。例:CGI::Lite->parse_form_data()、CGI.pm->Vars()、
phpだと$value=$_POST{'name'}など。CGI.pmだけは特殊で、x-www・・・以外のどんな場面であっても、
"POSTED=name=value&name=value&name・・・・"とゆう形で取得できる。

318 名前:311 mailto:sage [2008/06/24(火) 05:57:06 ID:???]
とゆうことで注目するのは、CGI::Liteだけ、"application/x-www-form-urlencoded"の後ろに"charset="が付くと、
データ取得関数でデータを取得出来ないことと、他の一般的なモジュールで本来取得できないハズの
Content-リクエストヘッダ無しの場合でも、普通にデータを取得出来てしまえるところに、混乱した原因があるようだ。

ちなみに、上の調査の追記としては、read(STDIN.$var,$ENV{'CONTENT_LENGTH}) を使えば、
全てのパターンでデータの取得が可能。(パースとデコードは全て自分でやらないといけないですが)
しかしながら、これを各moduleのデータ取得用関数の前に持ってくると、その後の取得関数が全てコケる。(値なしになる。)
また、取得関数の後に持ってきても、その前の関数の成功失敗に関わらず、データを取得できない。(phpでは未確認)
(多分STDINに対するファイルポインタが、終端まで行ってしまっためだと思う)

今までお恥ずかしいながら、ajaxに限らず、ほとんどCGI::Liteメインで書いてきた。(GET,POSTの違いも大して意識してなかった)
それにモジュールのロードが軽い(自機での測定で、CGI.pm比約四倍早い)し、自分には、CGI.pmは機能が豊富すぎて、
使いこなせてないって思ってた。

だけど、今後のこと(新しいブラウザ対応とか)を考えるに、どうもCGI::Liteだけではやっていけなくなってしまいそう。
まあ、最終リリースからもう五年もメンテされてないんで、早く乗り換えろよってのはもっともな話だとは思うけど・・。
なんかくやしいなぁ。

313さんへ、
自分はJavascriptについては、prototype.jsやjQueryなどの外部ライブラリを使ったことがなくて、余り詳しくもないんだけど、
これからはどうしようかと検討中です。でも今回の件に限れば、自分が受け側をCGI::Liteで利用したのが原因で
多分外部ライブラリ使ってても同じ現象に遭遇してたと思います。そんな時は余計に、原因の究明に困ったかも知れません。

とゆうことで、長々と失礼しました。同じような問題で悩んでる人がいたら、参考にして下さい。

319 名前:316貼り直し mailto:sage [2008/06/24(火) 06:17:21 ID:???]
mod   (#1)     (※) 
CL     なし     出来る 
CL     #2       出来る 
CL     #2 #8   出来ない 
CL     #3       出来ない 
Cp     なし     出来る(※) 
Cp     #2       出来る 
Cp     #2 #8   出来る 
Cp     #3       出来る(※) 
AR2   なし     出来ない 
AR2   #2       出来る 
AR2   #2 #8   出来る 
AR2   #3       出来ない 
php    なし     出来ない 
php    #2       出来る 
php    #2 #8   出来る 
php    #3       出来ない

説明は>>317の通り。
CL=CGI::Lite、Cp=CGI.pm、AR2=Apache2::Request、php=php(おまけ)。
#2 #8 は application/x-www-form-urlencoded; charset=UTF-8 のこと。
Apache2::Requestのつづり間違えてた。

320 名前:nobodyさん mailto:sage [2008/06/24(火) 10:11:34 ID:???]
cgiが正常ならクライアント側の問題だろ?
prototype.jsを遣わない理由がどこにある。

321 名前:nobodyさん mailto:sage [2008/06/24(火) 14:59:55 ID:???]
RequestHeaderが違ってくるのは、XMLHttpRequestメソッドとブラウザの問題だと思うんだけど。
ttp://www.fraction.jp/log/archives/2005/03/216

prototype.jsは関係ないんじゃない?と思ったが
XMLHttpRequestでgrepしてみると

/* Force "Connection: close" for older Mozilla browsers to work
* around a bug where XMLHttpRequest sends an incorrect
* Content-length header. See Mozilla Bugzilla #246651.
*/

こんなのが。補正してるってことかな?


RequestHeaderによっては受け取れない部分はCGI::Liteの問題。
知らないとハマるから、良い検証だったと思います。乙

322 名前:nobodyさん mailto:sage [2008/06/25(水) 05:30:05 ID:???]
>>320さん >>321さん
318です。仰るとおり、送って来るReuestHeaderが異なるのは、各ブラウザ側の挙動の違いの問題です。

その後、教えて頂いたprototype.jsのXHR周りの動作について、手持ちのブラウザで基本的な動作確認をしましたが、
やはり送ってくるRequestHeaderはブラウザごとに違います。設定によりいくらかのヘッダの操作も出来ますが、
FireFox3で、当該の"chaesrt=..."の部分を消すことは出来ないようです。

( これもブラウザにより異なります。IEでもデフォで、"charset="が付いてきたりします。
 ここら辺の違いを吸収してくれるハズのライブラリで、ブラウザごとに分かち書きとかしないといけないのは、
 本末転倒のような気がします。まあJavascriptのことはスレ違いになるんで、言及はここら辺でやめときます。)

323 名前:322 mailto:sage [2008/06/25(水) 05:30:57 ID:???]
で、何が問題かと言うと、実は今自分の運営しているサイトで、CGI::Liteで書いた既存のcgiが動いてるんですが、
現在、日中平均で30req/s前後、ピーク時で90-100req/s程度のリクエストがあります。このスクリプトを導入した際に、
CGI.pmとCGI::Liteでそれぞれベンチを取ったのですが、本番環境と同一ハード,ソフトの環境で、
CGI.pmだと40rq/s位で限界、CGI::Liteだと150-160rq/s位までは持ちこたえられるとの結果を得ましたので、
CGI::Lite版を採用することに決めました。(その時は、最大50rq/s程度が想定でしたが・・・)

で、今回これと同じ処理をするcgiに、Jsからajaxリクエストを投げるような構成を考えていたのですが、
そのテストの段で、上記の>>311のような問題に行き当たったわけです。
現実問題として、速度や負荷の観点から、今回もCGI::Liteで行こうと思ったのですが、上記のような問題のため
(prototype.jsを使う使わないに関係なく)CGI::Liteが使えないので困ったなぁ とゆう感じです。
( 実は、mod_perl+Apache2::Requestでは、同様の処理で 1800rq/s! とかベンチ出たんですが、
 実験的な環境のため、そのまま本番環境には投入できません。)

324 名前:nobodyさん mailto:sage [2008/06/25(水) 10:26:42 ID:???]
>>323
当然考えているとは思うけど、CGI::Lite に手を入れてしまうのがリーズナブルなんじゃないかな。
parse_form_data() 内で、
$content_type eq 'application/x-www-form-urlencoded'
と判断しているので、これを =~ にでもすればいいだけなわけだし。

325 名前:nobodyさん mailto:sage [2008/06/25(水) 13:14:34 ID:???]
簡単なパースしかしないなら、モジュール使わない方法もあるんじゃね?

326 名前:nobodyさん mailto:sage [2008/06/28(土) 19:23:20 ID:???]
HTMLフォームから送信されてきた文字列の中からURLを探しだして
<a href=>のタグをくっつけたいんですが、cgiのURLとかで?が入ってると上手く置き換えできません。
これを回避する方法を教えていただければ幸いです。

$mojiretu =~ s/$url/<a href="$url">$url<\/a>/; #$ulに?が入ってると置き換えできない。



327 名前:nobodyさん mailto:sage [2008/06/28(土) 19:59:00 ID:???]
>>326
上手く行くかどうかしらんし、根本的な解決にはならんかも知れんが、
$mojiretu =~ s/\Q$url\E/<a href="$url">$url<\/a>/;

328 名前:nobodyさん mailto:sage [2008/06/28(土) 20:12:33 ID:???]
>>327
うはwできた
ありがとおお!!

329 名前:nobodyさん mailto:sage [2008/06/28(土) 22:15:55 ID:???]
「\E までのパターン指定メタ文字の意味を打ち消す」

ってどういう意味かな?

330 名前:nobodyさん mailto:sage [2008/06/28(土) 22:29:45 ID:???]
$str="a?b";

のとき、

/$str/



/a?b/

じゃなくて、

/a\?b/

に展開されるようにしてくれる。


331 名前:nobodyさん mailto:sage [2008/06/28(土) 22:33:22 ID:???]
?が「パターン指定メタ文字」なんだな、たぶん。

それで、?があると、そのあとに続く文字が
特別な意味をもつんだな。

だからそれをエスケープ?しなくてはならなくて、
そのための呪文という意味か。よくわかりました。

332 名前:nobodyさん mailto:sage [2008/06/28(土) 22:50:41 ID:???]
>>331
>それで、?があると、そのあとに続く文字が
>特別な意味をもつんだな。
違うよw
ま、追い追い勉強しなw

333 名前:nobodyさん mailto:sage [2008/07/01(火) 21:46:30 ID:???]
perl -MCPAN -e shellの後に、install Math::BaseCalcしたら、
make: *** [test_dynamic] エラー 255ってでるんだよ
どうしたら、解決出きるのか教えてください

334 名前:nobodyさん mailto:sage [2008/07/01(火) 23:37:34 ID:???]
>>333
config で make program を変更してみるとか、、、フォースインストール
するとか、、、
俺の場合はMath::BaseCalcじゃないけど、makeでコケた奴はソースで手動で
コンパイルして入れたりもする。

335 名前:nobodyさん mailto:sage [2008/07/01(火) 23:40:04 ID:???]
>>333
まずはインストール時のメッセージをじっくり調べてみてはいかがでしょう。

336 名前:うっとりハムちゃん [2008/07/05(土) 00:33:32 ID:NR2upuAB]
すいません、おじゃまします。

cgiにアクセスした際に、同時に○○.phpを読み込む際のPerl記述を教えていただけると助かります。
よろしくおねがいします。




337 名前:nobodyさん mailto:sage [2008/07/05(土) 09:04:26 ID:???]
つ system
つ ``


338 名前:うっとりハムちゃん [2008/07/05(土) 13:03:49 ID:NR2upuAB]
レスありがとうございます!

例えば○○.php を読み込みたい(実行したい)場合、以下では無反応なのですが、間違っていますか?

system ("○○.php");


339 名前:うっとりハムちゃん [2008/07/05(土) 13:38:38 ID:NR2upuAB]
説明不足で申し訳ないのですが、用途としては、
phpカウンターをcgi(掲示板)実行時にも
カウントさせたいのです。

IMGタグでphpを読み込んでもいいのですが、
これだと携帯で見た時に壊れた画像マークになっちゃうので。。。

それで、cgiを実行時にphpファイルも同時実行できないかと思い、困っています。
よろしくお願いします。

340 名前:nobodyさん mailto:sage [2008/07/05(土) 14:13:13 ID:???]
携帯でそうなる理由を調べてそれを解消したほうが早い
systemで実行するなら/usr/local/bin/php xxx.phpとかだろうけど
それでキミの欲しいものが得られるのか?
http経由で呼ぶならそうすればいい

341 名前:うっとりハムちゃん mailto:sage [2008/07/05(土) 15:00:49 ID:???]
できました!
とても助かりました!!
どうもありがとうございました。 m(_ _)m


342 名前:nobodyさん mailto:sage [2008/07/05(土) 20:33:29 ID:???]
>>341
おめでとう。
何をどう変えてどのような望む動作が得られたのかはさっぱりわからんが。

343 名前:nobodyさん mailto:sage [2008/07/05(土) 21:27:12 ID:???]
おそらく直に読んでカウンターが上がったんじゃないかと

344 名前:うっとりハムちゃん [2008/07/05(土) 23:02:34 ID:NR2upuAB]
たびたびすいません (><)

system ("/usr/local/bin/php ○○.php");


↑これで うまくできたのですが、他のレンタルサーバーでも使おうと思ってみたら、
そっちではphpを読み込んでくれず、ソースコードが丸ごと表示されちゃいました。
サーバーによって動作は異なるのでしょうか?





345 名前:うっとりハムちゃん [2008/07/06(日) 01:29:25 ID:+aL1pH4z]
もしかして system の場合、何か終了(閉じる?)を記載しないといけないのでしょうか?
単純にphpカウンターを実行するだけでいいのですが。。。

346 名前:nobodyさん mailto:sage [2008/07/06(日) 02:26:42 ID:???]
>>344
そりゃあんた、その違うレンサバとやらがphp対応なのかどうかと、
phpの実行パスが/usr/local/bin/phpとは限らんだろう。

サーバによっては、httpからはphp実行出来ても、ユーザー権限で直接実行出来ないように
設定されてる場合もあるし。



347 名前:うっとりハムちゃん [2008/07/06(日) 02:40:09 ID:+aL1pH4z]
ありがとうございます。
サーバー会社に問い合わせたところ、

system ("/usr/local/bin/php ○○.php");

で動作しますと言われました。
パスに関してはあっているようです。






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

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

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