くだすれPerl(超初心者用)2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/03/03(月) 05:07:32ID:???もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。
0263nobodyさん
2008/05/31(土) 02:02:14ID:???0264nobodyさん
2008/05/31(土) 15:52:59ID:???>$in{'ext'} = extfind($in{'orgname'});
サブルーチン(?) extfindの一番目の引数にハッシュ$in{'orgname'}の値をセットして
呼び出し、戻り値をハッシュ$in{'ext'}に代入。
>if(!$in{'ext'} && $in{'upfile'}){ &error(202); }
次にハッシュ$in{'ext'}の中の人が留守で、
尚且つハッシュ$in{'upfile'}の中の人が居る場合
恐らくエラーメッセージを表示するであろう
サブルーチンerrorの一番目の引数に"202"をセットして呼び出す。
ちなみに2行を一行にまとめると↓みたいになる
&error(202) if(!&extfind($in{'orgname'}) && $in{'upfile'});
0265264
2008/05/31(土) 15:54:58ID:???0266264
2008/05/31(土) 16:03:00ID:???オリジナルと大して変わらんけどこうやればいけるか
スレ汚しスマソ・・
0267nobodyさん
2008/05/31(土) 18:48:39ID:???という質問が出易くなりますな。
0268nobodyさん
2008/05/31(土) 20:14:45ID:???やっぱりperl難しいな・・・
http://sugachan.dip.jp/obsolete/snup/
拡張子合わずってログに記録したときは
ファイルをアップしないように改造しようかと
思ってるのだがなかなかできなくて。。。
$in{'ext'} = extfind($in{'orgname'}); if(!$in{'ext'} && $in{'upfile'}){ &error(202); }
を
$in{'ext'} = extfind($in{'orgname'}); if(!$in{'ext'}){ &error(202); }
に、しても普通にアップロードできてしまうし。。。どこがおかしい?
0269nobodyさん
2008/05/31(土) 20:40:29ID:???そこのアップローダの改造の質問 って前にもどこぞで見たなあ。
で「改造スレに行け」と言われてたハズだが?
ソースが好みじゃないのでやる気にならん。…改造スレ行けば?
0270nobodyさん
2008/06/04(水) 08:35:22ID:???テキストエリアに文字を入力して、投稿ボタンを押すとregist.cgiに渡されて書き込まれる仕組みです
このregist.cgiはmessageとcountという2つの引数をとるみたいなのですが、
ブラウザからURL:/aaa/bbb/regist.cgi?message=test&count=1
とやっても書き込まれませんでした
ちなみにFirefoxのTemperDataで確認したリクエストとレスポンス上ではベーシック認証は使われていませんでした
最終的にはperlで自動的に書き込んでくれるプログラムを書きたいのですが、まずはperlでこのregist.cgiに投稿するにはどうすればいいか教えてください
0271nobodyさん
2008/06/04(水) 10:11:46ID:???0272nobodyさん
2008/06/04(水) 14:06:46ID:???0273nobodyさん
2008/06/06(金) 23:21:44ID:???0276nobodyさん
2008/06/13(金) 17:42:23ID:GNaVOr+fpack('C*','0xe4','0xba','0xba')とやっても化けてしまいます。
どういう式を書けばいいのですか?
0277nobodyさん
2008/06/13(金) 18:06:20ID:???0278nobodyさん
2008/06/13(金) 18:32:03ID:???ありがとうございます。できました。
裸のままでよかったのですね。
pack('H*','e4baba');
というのもあったみたいです。
今は10進→16進→文字なんですが、
10進から直接変換できますか?
0279nobodyさん
2008/06/13(金) 18:37:43ID:???pack('C*',228,186,186) とか
10進の数字しかないならpack('C*','228','186','186') でも通るけどな。
0280nobodyさん
2008/06/13(金) 19:26:54ID:???文字列との違いが判りました。
UTF-8のコード範囲を調べると
[\x00-\x7f]
[\xC0-\xDF][\x80-\xBF]
[\xE0-\xEF][\x80-\xBF][\x80-\xBF]
[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]
とあります。
これには他の言語も含まれているとおもいます。
先ほど教えていただいた変換で一覧を作ろうと思うのですが、中国語なども混ざってしまいます。
日本語のみの範囲はどのようなものなのでしょうか。
0281nobodyさん
2008/06/13(金) 19:41:37ID:???0282nobodyさん
2008/06/13(金) 20:36:31ID:???罫線とか利用している文字もありますね。
なかなか難しい。
0283nobodyさん
2008/06/15(日) 14:13:18ID:???そんなことはできませんか?
0284nobodyさん
2008/06/15(日) 14:29:37ID:???このエラーの意味が分からないのですが、教えて頂けませんか?
0286nobodyさん
2008/06/15(日) 22:45:56ID:???>>285 =~ s/連結の方法がおかしい/未定義値を文字列として評価している/;
例えば $foo が undef の状態で "foo$foo" とか 'foo' . $foo とか。
0287nobodyさん
2008/06/16(月) 09:05:17ID:???あるサブルーチンでファイルを扱おうとしています。
evalの中でopenしたファイルハンドルをエラー処理(if $@)で閉じるにはどうすればよいのでしょうか。
環境はperl5.8 use strictです。
0288nobodyさん
2008/06/16(月) 10:45:47ID:???より
#!C:/perl/bin/perl
open(IN,"example.log");
while(<IN>){
$i++;
if($i == 3){ $line .= "\t\t$_"; }
else{ $line .= "$_"; }
}
close(IN);
open(OUT,">example.log");
print OUT $line;
close(OUT);
print"Content-type:text/html\n\n";
print "変更完了";
0289nobodyさん
2008/06/16(月) 10:49:36ID:???より
#!C:/perl/bin/perl
open(IN,"example.log");
while(<IN>){
unless($_ =~ /hoge/){ $line .= "$_"; }
else{ $line .= "\n"; }
}
close(IN);
open(OUT,">example.log");
print OUT $line;
close(OUT);
print"Content-type:text/html\n\n";
print "消去完了";
0290nobodyさん
2008/06/16(月) 13:00:09ID:???せっかくお答えいただいたのにすみません。
私が知りたいのはスコープを跨ぐ場合の話です。
例えば、evalの中で宣言した変数をevalの外で使おうとすると、perlに叱られます。
ファイルハンドルの場合は叱られないのですが、これが作法に則った方法なのかわかりません。
my $fh = IO::File 〜とかopen my $fh〜等を使って
いちいち閉じなくていいようにする。
案2)
use IO::File;して
my $fh = *FH{IO};
$fh->close() if defined($fh) && $fh->opened();
0292nobodyさん
2008/06/16(月) 16:00:58ID:???失礼。他のスレッドへの返答でした。
http://pc11.2ch.net/test/read.cgi/tech/1208674881/519 への回答
# 変数が半角スペースで始まっていれば、半角スペースを先頭一個だけ消去
if($example =~ /^ /){ $example =~ s/ //; }
# 変数が全角スペースで始まっていれば、全角スペースを先頭から一個だけ消去
elsif($example =~ /^ /){ $example =~ s/ //; }
拙いですがどうですか?
0293nobodyさん
2008/06/16(月) 16:05:48ID:???修正です。
# 先頭の全角スペース、半角スペースの連続を削除
$example =~ s/^([\ \ ]+)//;
0294nobodyさん
2008/06/16(月) 17:36:08ID:???もうひとつファイルを用意して、
書き出して言ったらダメなの?
>>293
スクリプトとファイルの文字コードが同じならいいけど。
0295nobodyさん
2008/06/16(月) 21:58:28ID:???ありがとうございます。
お答えいただいた案1がしっくりきたので、この方式で行きます。
またよろしくお願いします。
0297nobodyさん
2008/06/18(水) 00:25:23ID:Mmy0x8n6print "あ";
で一秒待ってから
print "い";
を実行する方法ってありますか?
localtimeで受け取って1秒過ぎるまでwhileで空白を書き続けるってのも考えたんですが・・・
負荷がかかりそうなんで。
0298nobodyさん
2008/06/18(水) 01:19:02ID:???0299nobodyさん
2008/06/19(木) 06:37:25ID:???0300nobodyさん
2008/06/19(木) 10:35:29ID:???0301うっとりハムちゃん
2008/06/20(金) 15:05:12ID:nHevfWAE掲示板に書き込まれた内容に URLが含まれていた場合、
自動的にリンクになるようにしたいのですが、
簡単に追加する方法等がありますか?
よろしくお願いします。
0302nobodyさん
2008/06/20(金) 15:20:25ID:???正規表現 perl URL とかでググれば例が出てくると思う
0303nobodyさん
2008/06/20(金) 22:01:17ID:???$_ =~ s/([^=^\"]|^)(http\:\/\/[\w\.\,\~\-\/\?\&\+\=\:\@\%\;\#\%\*]+)/$1<a href=\"$2\">$2<\/a>/g;
0304nobodyさん
2008/06/20(金) 22:29:00ID:???文字クラス中のエスケープは更に酷い。
0305うっとりハムちゃん
2008/06/21(土) 03:14:25ID:k6DOaEg8>303 さんの記述を一行足すだけではダメですよね?
例えば $comment 内に書き込まれた中から抜粋する際は
それを指定する必要などはありますか?
0306nobodyさん
2008/06/21(土) 07:47:06ID:???0307nobodyさん
2008/06/21(土) 17:19:06ID:???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メモ
http://www.din.or.jp/~ohzaki/perl.htm#httpURL
0308うっとりハムちゃん
2008/06/21(土) 19:10:28ID:???とても親切で、どうもありがとうございました!!
助かりました! m(_ _)m
0309297
2008/06/21(土) 21:40:03ID:etCJxH2Bありがとうございました。
0310nobodyさん
2008/06/23(月) 09:49:20ID:???0311nobodyさん
2008/06/23(月) 20:42:58ID:???---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送信のテストをしたんだけども・・・、
0312311
2008/06/23(月) 20:43:29ID:???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とも問題ありません。
0313nobodyさん
2008/06/23(月) 22:23:59ID:???つ prototype.js
0314311
2008/06/24(火) 05:32:07ID:???ありがとうございます。そうなんですよ。
実は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"にありました。
具体的には以下
0315311
2008/06/24(火) 05:38:53ID:???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で固定のようです。)
0316311
2008/06/24(火) 05:48:29ID:???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 出来ない
0317311
2008/06/24(火) 05:56:14ID:???>>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・・・・"とゆう形で取得できる。
0318311
2008/06/24(火) 05:57:06ID:???データ取得関数でデータを取得出来ないことと、他の一般的なモジュールで本来取得できないハズの
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で利用したのが原因で
多分外部ライブラリ使ってても同じ現象に遭遇してたと思います。そんな時は余計に、原因の究明に困ったかも知れません。
とゆうことで、長々と失礼しました。同じような問題で悩んでる人がいたら、参考にして下さい。
0319316貼り直し
2008/06/24(火) 06:17:21ID:???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のつづり間違えてた。
0320nobodyさん
2008/06/24(火) 10:11:34ID:???prototype.jsを遣わない理由がどこにある。
0321nobodyさん
2008/06/24(火) 14:59:55ID:???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の問題。
知らないとハマるから、良い検証だったと思います。乙
0322nobodyさん
2008/06/25(水) 05:30:05ID:???318です。仰るとおり、送って来るReuestHeaderが異なるのは、各ブラウザ側の挙動の違いの問題です。
その後、教えて頂いたprototype.jsのXHR周りの動作について、手持ちのブラウザで基本的な動作確認をしましたが、
やはり送ってくるRequestHeaderはブラウザごとに違います。設定によりいくらかのヘッダの操作も出来ますが、
FireFox3で、当該の"chaesrt=..."の部分を消すことは出来ないようです。
( これもブラウザにより異なります。IEでもデフォで、"charset="が付いてきたりします。
ここら辺の違いを吸収してくれるハズのライブラリで、ブラウザごとに分かち書きとかしないといけないのは、
本末転倒のような気がします。まあJavascriptのことはスレ違いになるんで、言及はここら辺でやめときます。)
0323322
2008/06/25(水) 05:30:57ID:???現在、日中平均で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! とかベンチ出たんですが、
実験的な環境のため、そのまま本番環境には投入できません。)
0324nobodyさん
2008/06/25(水) 10:26:42ID:???当然考えているとは思うけど、CGI::Lite に手を入れてしまうのがリーズナブルなんじゃないかな。
parse_form_data() 内で、
$content_type eq 'application/x-www-form-urlencoded'
と判断しているので、これを =~ にでもすればいいだけなわけだし。
0325nobodyさん
2008/06/25(水) 13:14:34ID:???0326nobodyさん
2008/06/28(土) 19:23:20ID:???<a href=>のタグをくっつけたいんですが、cgiのURLとかで?が入ってると上手く置き換えできません。
これを回避する方法を教えていただければ幸いです。
$mojiretu =~ s/$url/<a href="$url">$url<\/a>/; #$ulに?が入ってると置き換えできない。
0327nobodyさん
2008/06/28(土) 19:59:00ID:???上手く行くかどうかしらんし、根本的な解決にはならんかも知れんが、
$mojiretu =~ s/\Q$url\E/<a href="$url">$url<\/a>/;
0329nobodyさん
2008/06/28(土) 22:15:55ID:???ってどういう意味かな?
0330nobodyさん
2008/06/28(土) 22:29:45ID:???のとき、
/$str/
が
/a?b/
じゃなくて、
/a\?b/
に展開されるようにしてくれる。
0331nobodyさん
2008/06/28(土) 22:33:22ID:???それで、?があると、そのあとに続く文字が
特別な意味をもつんだな。
だからそれをエスケープ?しなくてはならなくて、
そのための呪文という意味か。よくわかりました。
0333nobodyさん
2008/07/01(火) 21:46:30ID:???make: *** [test_dynamic] エラー 255ってでるんだよ
どうしたら、解決出きるのか教えてください
0334nobodyさん
2008/07/01(火) 23:37:34ID:???config で make program を変更してみるとか、、、フォースインストール
するとか、、、
俺の場合はMath::BaseCalcじゃないけど、makeでコケた奴はソースで手動で
コンパイルして入れたりもする。
0336うっとりハムちゃん
2008/07/05(土) 00:33:32ID:NR2upuABcgiにアクセスした際に、同時に○○.phpを読み込む際のPerl記述を教えていただけると助かります。
よろしくおねがいします。
0337nobodyさん
2008/07/05(土) 09:04:26ID:???つ ``
0338うっとりハムちゃん
2008/07/05(土) 13:03:49ID:NR2upuAB例えば○○.php を読み込みたい(実行したい)場合、以下では無反応なのですが、間違っていますか?
system ("○○.php");
0339うっとりハムちゃん
2008/07/05(土) 13:38:38ID:NR2upuABphpカウンターをcgi(掲示板)実行時にも
カウントさせたいのです。
IMGタグでphpを読み込んでもいいのですが、
これだと携帯で見た時に壊れた画像マークになっちゃうので。。。
それで、cgiを実行時にphpファイルも同時実行できないかと思い、困っています。
よろしくお願いします。
0340nobodyさん
2008/07/05(土) 14:13:13ID:???systemで実行するなら/usr/local/bin/php xxx.phpとかだろうけど
それでキミの欲しいものが得られるのか?
http経由で呼ぶならそうすればいい
0341うっとりハムちゃん
2008/07/05(土) 15:00:49ID:???とても助かりました!!
どうもありがとうございました。 m(_ _)m
0343nobodyさん
2008/07/05(土) 21:27:12ID:???0344うっとりハムちゃん
2008/07/05(土) 23:02:34ID:NR2upuABsystem ("/usr/local/bin/php ○○.php");
↑これで うまくできたのですが、他のレンタルサーバーでも使おうと思ってみたら、
そっちではphpを読み込んでくれず、ソースコードが丸ごと表示されちゃいました。
サーバーによって動作は異なるのでしょうか?
0345うっとりハムちゃん
2008/07/06(日) 01:29:25ID:+aL1pH4z単純にphpカウンターを実行するだけでいいのですが。。。
0346nobodyさん
2008/07/06(日) 02:26:42ID:???そりゃあんた、その違うレンサバとやらがphp対応なのかどうかと、
phpの実行パスが/usr/local/bin/phpとは限らんだろう。
サーバによっては、httpからはphp実行出来ても、ユーザー権限で直接実行出来ないように
設定されてる場合もあるし。
0347うっとりハムちゃん
2008/07/06(日) 02:40:09ID:+aL1pH4zサーバー会社に問い合わせたところ、
system ("/usr/local/bin/php ○○.php");
で動作しますと言われました。
パスに関してはあっているようです。
0348nobodyさん
2008/07/06(日) 10:59:36ID:???KENTWEBさんのところのBASIC認証式パスワード管理pwmgrというCGIを使いたいと思っています。
サーバーはろりぽっぷなのですが
CGIプログラムの説明を読んでいると、ログの取得について、
# 【利用条件】
# 1. SSIの利用できるサーバ
# 2. 環境変数 $ENV{'REMOTE_USER'} にてユーザーIDが取得できること
# ※ 2. については、同梱の pwlog_test.cgi にてテストすること
とあるのですが、
環境変数 $ENV{'REMOTE_USER'} とは何なんでしょうか?
使えない場合、使えるようにする方法はあるんでしょうか?
教えて下さい。
よろしくお願いします。
また、他の方法でIDとホスト名をリスト化することはできないでしょうか?
0349nobodyさん
2008/07/06(日) 13:52:43ID:???0350nobodyさん
2008/07/06(日) 15:54:22ID:???固有の ID であれば良い、ということであれば、何かユニークな文字列を生成して $ENV{'REMOTE_USER'} に代入しておく手もあります。
あんまり筋の良くない手法なので元のスクリプトの動作を理解した上でどうぞ。
詳細は perlvar の %ENV ハッシュの項を見てください。
0351うっとりハムちゃん
2008/07/06(日) 16:27:06ID:+aL1pH4zsystem ("/usr/local/bin/php ○○.php");
で正常に動作するのはCLI版のPHPで、
CGI版のPHPだとヘッダが出力されるため
表示がおかしくなり、動作しないみたいです。
解決するためにはCGI版のPHPでヘッダが出力されないように
systemを行いたいのですが、その場合の記述は
どのようになるのでしょうか?
0352nobodyさん
2008/07/06(日) 17:26:48ID:???# 勘でレス
my $php_output = qx{"/usr/loca/bin/php ○○.php"};
print +(split(/\n\n/, $php_output, 2))[1];
0353うっとりハムちゃん
2008/07/06(日) 17:41:18ID:+aL1pH4zmy $php_output = qx{"/usr/local/bin/php ○○.php"};
print +(split(/\n\n/, $php_output, 2))[1];
を使わせていただきましたが、phpが実行されませんでした。。
0355うっとりハムちゃん
2008/07/06(日) 18:17:32ID:+aL1pH4zphpを実行しようとしているようですが、そのために
ヘッダが出力されるため表示がおかしくなり、動作しないみたいです。
0356352
2008/07/06(日) 18:29:36ID:???# Perl スクリプトをその場で即座に終了してよければ
exec( qw{/usr/local/bin/php -q ○○.php} );
ちなみになぜ勘なのかというと、情報がタリンからです。
ぱっと思いついた不足情報を以下に列挙しておきます。
・最終的に端末に返されるデータはどういうものか
・それは perl から返すのか php から返すのか
・Perl スクリプトで system() を呼び出す前後にどのような処理を行い、
・また、どのような出力をどこに返しているか
「phpが実行されませんでした」
・PHP処理系が起動しないのか、
・期待した表示が行われないだけなのか
「表示がおかしくなり」
「動作しないみたいです」
・おかしいとは具体的にどういうことか
・おかしいながらも表示はされているのに動作しないとはどういうことか
0357うっとりハムちゃん
2008/07/06(日) 19:15:01ID:+aL1pH4z掲示板CGIにアクセスがあった際に
phpカウンターを同時に実行(カウント)させたいのです。
とくに戻ってくる必要はなく、基本的には教えていただいた
system ("/usr/local/bin/php ○○.php");
で良さそうなのですが、問題は
CGI版のPHPでヘッダが出力されないように
systemを行うことなので、悩んでいます。
system ("/usr/local/bin/php ○○.php");
の場合、phpのヘッダが戻ってくることにより
CGIがおかしくなり、ソースコードがまるまる表示されてしまいます。
単純に、返ってくるヘッダを無効(?)にする記述があると助かります。
説明が下手ですいません。。
0358352
2008/07/06(日) 21:03:06ID:???> 単純に、返ってくるヘッダを無効(?)にする記述があると助かります。
実際に HTTP Response Header 出力が原因だとすれば、やはり、
system( qw{/usr/local/bin/php -q ○○.php} ); # -q に注目
でうまいこといきませんか。
> CGIがおかしくなり、ソースコードがまるまる表示されてしまいます。
「CGIがおかしくなり」には具体的情報がありません。
「ソースコード」は何のソースコードでしょう?
どうしてもうまくいかないときは、あっさり発想を切り換えて別の設計を試すのも一興。
がんばってください。
0359nobodyさん
2008/07/07(月) 01:56:34ID:???phpから帰って来た値(文字列)を出力する必要あるのか?
それまでの説明から、
> 掲示板CGIにアクセスがあった際に
> phpカウンターを同時に実行(カウント)させたいのです。
ってことだから、多分外部ファイルなりにカウントを保存してるんだと思うけど、
その数値がインクリメントされさえすればいいってのなら、
my $php_res = `/usr/local/bin/php *.php`; とでもして、
その受け取った戻り値の$php_resは出力させなければいい。
system()にしろ、print $php_res; にしろ受け取った戻り値をそのまま出力させようとするから、ヘッダとかでおかしくなる。
どうしても戻り値をperl側から出力したいのであれば、>>352で出来そうな気もするけど、
ひょっとしたら改行が"\r\n"かも知れないので、
for (split/\n/,$php_res){
print "$_\n" unless(m/^Content\-type:/i);
}
でどうか?(生の戻り値に"Content-type"から始まる文字列行がないことが前提だけど・・)
> ソースコードがまるまる表示されてしまいます。
これだけど、自分のごく勝手な勘だけど、上記の件とは無関係に、<? ?>が原因でね?
ちゃんと<?php ?>にしてるか〜?
0360うっとりハムちゃん
2008/07/07(月) 02:22:31ID:w0zyvflA>358
-q でヘッダを出力しないようにできると思ったのですが、ダメでした。
同様にCGIのプログラムが まるまる表示されてしまいます。
phpを実行しているのは間違いなさそうですが、
戻ってきたヘッダが、その後のcgiを無効にしちゃっているみたいです。
>359
おっしゃるとおり、外部ファイルにカウントしているので、
php自体は。あくまでも実行させるだけで、
返ってくるヘッダは無用なのです。
さっそく
my $php_res = `/usr/local/bin/php ○○.php`;
for (split/\n/,$php_res){
print "$_\n" unless(m/^Content\-type:/i);
}
と記述してみましたが、戻ってきたヘッダが邪魔をして
cgiのプログラムが まるまる表示されてしまいます。
php自体は実行させているようです。
戻り値に Content-type ですよね!?
たぶん、入っていないかと。。。
phpのほうは、
<?php
?>
ではさんでいます。
0361nobodyさん
2008/07/07(月) 05:51:43ID:???なあそれ、phpの呼び出し云々ではなくて、cgi(perl)のほうは正常に動いてる?
(例えば、print "hellow world"だけとか、php呼び出し部分をコメントアウトするとかして)
> cgiのプログラムが まるまる表示されてしまいます。
コレ見るに、その"別のレンサバ"とやらに移したときに、*.cgiに実行権限がないとか、
実行が許可されてないディレクトリに配置したとか、そこらへんは大丈夫か?
phpの戻り値に"Content-type"ヘッダがあろうがなかろうが、cgiがちゃんと実行されてたなら、
そのcgiのソースが表示されるってことはないと思う。
(仮にヘッダ出力がおかしくても、500 Internal Server Errorとかになるハズ)
0362nobodyさん
2008/07/07(月) 10:16:19ID:???■ このスレッドは過去ログ倉庫に格納されています