CGIだけどなんか質問ある Pert 5.01
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/03/03 12:49ID:673UxTI50136nobodyさん
02/03/05 06:23ID:???013775とか
02/03/05 06:25ID:???0138nobodyさん
02/03/05 06:26ID:???if ($QUERY{'page'}==0) { #ページ指定がなければ発言リストを出力
$title = "<div align=center>最新の15件</div><br>";
&jcode::convert(\$title, 'sjis','euc');
print "$title";
$end_count=0;
while(<IN>){
013975とか
02/03/05 06:32ID:???0140nobodyさん
02/03/05 06:32ID:???while(<IN>){
chop($_=<IN>); ### ADD NEW
($date, $time, $from, $_)= split($SEPA, $_, 4); ### ADD NEW
# $date=$_;
$date =~ s/(\d+)年(\d+)月(\d+)日/$2月$3日/g;
# $time=<IN>;
$time =~ s/(\d+)時(\d+)分(\d+)秒/$1時$2分/g;
# $from=<IN>;
# while (1) {
# $_=<IN>;
# if ($_ =~ /^<!-- end of comment -->/) {last;}
# }
014175とか
02/03/05 06:35ID:???0142nobodyさん
02/03/05 06:40ID:???チョット間違いDA!!
chop($_=<IN>); ⇒ chop;
たまにはわざと間違うからYO-!
014375とか
02/03/05 06:40ID:???014475とか
02/03/05 06:42ID:???0145nobodyさん
02/03/05 06:48ID:???面倒だから字下げは省略だ!
} else { #ページ指定があれば指定ページまで飛ぶ
if ($QUERY{'page'}>15) {$QUERY{'page'}=15};
$end_count=0;
while(1){
if ($end_count>=($QUERY{'page'}-1)){
last;
}
0146nobodyさん
02/03/05 06:50ID:???while(1){
if ($end_count>=($QUERY{'page'}-1)){
last;
}
$_= <IN>; $end_count++; ### ADD NEW
# if (<IN> =~ /^<!-- end of comment -->/) { # コメントの終端を判定
# $end_count++;
# }
}
014775とか
02/03/05 06:55ID:???0148nobodyさん
02/03/05 06:56ID:???これで else ブロック内まで書き終わったことになるから覚悟しRO!
chop; ### ADD NEW
($date, $time, $from, $_)= split($SEPA, $_, 4); ### ADD NEW
s/</</g; s/>/>/g; ### ADD NEW
=comment3
$date=<IN>;
$time=<IN>; #時間(使わない)
$from=<IN>;
while (1) {
$_=<IN>;
if ($_ =~ /^<!-- end of comment -->/) {last;}
=cut
&jcode::convert(\$_, 'sjis','euc');
=comment4
$_ =~ s/<!--/<!--/g;
$_ =~ s/-->/-->/g;
$_ =~ s/&/&/g;
$_ =~ s/"/"/g;
$_ =~ s/</</g;
$_ =~ s/>/>/g;
print "$_<br>\n";
}
=cut
&jcode::convert(\$from, 'sjis','euc');
print "$_<br>\n"; ### ADD NEW
print "<div align=\"right\">$from</div>\n";
0149nobodyさん
02/03/05 07:00ID:???まあ、実際に動作させてないから間違ってるかもしれんがそこはご愛嬌!!
こっちのサーバ立ち上げるのもめんどいし、そう間違ってもいないダロウ!!
ポジィティブシンキングってやつだ!!
だた、最後にこれだけは言わせてもらうからナ!!
言葉遣いが荒っぽくて御無礼お許しください。(ペコリッ
015075とか
02/03/05 07:08ID:???大変勉強になりました。訂正前に比べて、非常に美しい形になりました。
まだ、ちょっと意味不明なところもありますが、調べればすぐわかりそうな位
簡潔ですね!!
0151nobodyさん
02/03/05 07:15ID:???Perl苦手みたいネ!!
かなり無駄な部分が見うけられるからもっとスッキリしたコードに
なるはずです。
015275とか
02/03/05 07:17ID:???完成したら是非見に来て欲しいので、よろしければメールください。
さっきのソースの最後のメールアドレス、残ってるかな?
まあいいや。気が向いたらよろしくお願いします。
本当にありがとうございました!
これから仕事に出かけます..(鬱)。
015375とか
02/03/05 07:23ID:???とほほさんのばっか参考にさせてもらってたので、他の人のソースはかえってムズカシイっす。
本一冊買おうかな。
では、お出かけします。あー眠い。
0155nobodyさん
02/03/05 09:11ID:???他人にみやすく、時間がたった後の自分にみやすく、メンテや機能追加のしやすいコーディングをするっていう方針は間違ってるかなあ?
0156nobodyさん
02/03/05 11:47ID:???0158プリクラ
02/03/05 21:46ID:zRZgn879if ($tagkey) { $value =~ s/<>/<>/g; }
else {
$value =~ s/\&/&/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
}
となってるんですけど、どうしてこれが機能するかわからんです。
正規表現の置換って s/★/☆/g で★が☆に変換されるってことじゃないのです?
だとするとなんで$value =~ s/<>/<>/g;でタグが許可されるのか
わかんないよ。
0159nobodyさん
02/03/05 21:51ID:???else以下だとタグを全て&;lt;などに変換している。
$value =~ s/<>/&;lt;&;gt;/g;では<>がセットになっているときだけしか変換をしない。
つまり、<b>の場合、<>の間にbが入っているからマッチングしない。
0160nobodyさん
02/03/05 21:53ID:???下2行は無駄。あ、HTMLにしたから&ltが<に化けてるのか。
<を&ltに変えればそれはHTMLタグではなくなる。
<html>
<html&rt -ブラウザでは-> <html>と見える。
016175とか
02/03/05 22:06ID:???おかげさまでYO!ソースはかなり見栄えよくなって、秘密モードも対応できたんだけどYO!
肝心の文字化けは全く解決しなかったPPE!!!
でYO!携帯携帯とか言ってパケット料金無駄づかいしてテストしてたKEDO!
携帯ページにIEで行って(sjisフォームで)書き込んでも文字BAKEdaZEYO!
フリダシに戻ったっPE!!気づいたらレスくれYO!!!
0163nobodyさん
02/03/05 22:29ID:uMIlDzWPって何か間違ってる?
0165nobodyさん
02/03/05 22:58ID:???sub ab { "ab" }
0168お腹さん@名無しいっぱい。
02/03/05 23:27ID:???呼んだ?
016975とか
02/03/05 23:43ID:???>>161のとおりなんだけども!ウザいとか言われてへこむから、
なんか端的な解決策あったらお願いしますYO!!!!!!
0170お腹さん@名無しいっぱい。
02/03/06 00:11ID:???そうさネー。もっとスクリプトを整理することサネー。
チョット仕様がわかりかねる部分があるケド、MODEがcomment,light,cellular の
3つがあってcommentモードは print "Location: "; exit; で終わってるのはどう
いう処理?
017175とか
02/03/06 00:19ID:???もっと簡潔な処理できますね。
でも、どうやらもっと別の要因の気がします。
今、フォームデコードする直前あたりからEUCに変換するまでをバイナリで
丹念に調べてます。
0172お腹さん@名無しいっぱい。
02/03/06 00:25ID:???Location: でパラメータを渡さずにこのCGIを呼ぶならどれも実行されないような
気もするケド。。。最終的にLocation: http://xxxxxxx の指定を書くというこTO?
017375とか
02/03/06 00:29ID:???引数なければそっちに行くんです。だから、Locationで飛ばさなくていいんですよね。
なんでそんなことしてたんだろう。
0174お腹さん@名無しいっぱい。
02/03/06 00:32ID:???017575とか
02/03/06 00:57ID:???昨日教わったフォームデータを受けてるところ、調べてみたら
同じアという文字をEUCとsjisで送信すると
EUCでは%8E%B1を受け取ってデコード直後から最後まで8Dになってます。
sjisでは%B1を受け取って最後までB1のまま。
&jcode'convert(*value, "euc",$form_code,"z");
とか
&jcode'h2z_sjis(*value);
って文法間違ってないですよね??
0176お腹さん@名無しいっぱい。
02/03/06 00:59ID:???if ($in{'mode'} eq "comment" && $in{'message'} ){
commentモード処理;
exit;
}
if ($in{'mode'} eq "light"){
ligntモード処理;
exit;
}
if ($in{'mode'} eq "cellular"){
ligntモード処理;
exit;
}
※ 現在、大まかに上の処理の流れになっているのでif文がそれぞれ独立していて、
それぞれのブロックが終了したら exit; で処理が終了してしまう。つまり、
2つのifブロックを実行することはありえないし、パラメータによってはどの
ifブロックも実行しないでなにも返さないCGIになってしまい、スクリプトエラー
になると思う。したがって、大枠としては以下のように書き替えたほうがいいの
では?
;# URLデコード処理実行
if ($in{'mode'} eq "comment" && $in{'message'} ){
commentモード処理;
}
elsif ($in{'mode'} eq "light"){
ligntモード処理;
}
elsif ($in{'mode'} eq "cellular"){
ligntモード処理;
}
else { デフォルト処理;}
017775とか
02/03/06 01:02ID:???0178お腹さん@名無しいっぱい。
02/03/06 01:07ID:???別に半角のままでも化けないかもわからないので、まず処理構造をスッキリ
スマートにさせたほうが分かり易くなると思う。
少し読み進めてみると、ファイルロックはしないようにしたみたいダケド、ロックファイル
の後始末(アンロック)などが残っているのでこれは削除したラ?
0179お腹さん@名無しいっぱい。
02/03/06 01:10ID:???付加しないと動かないとかとほほに書いてあったようなきがするケドドウ?
018075とか
02/03/06 01:15ID:???関係なさそうだったのでカットしただけです。
デフォルト処理はif文無しなので、変なパラメータならデフォルトが実行されます。
これ、とほほさんのラウンジの構造そのものなんですが(笑)。
でも全部elsifで繋いだほうが後始末何度も書かなくて済むのでより簡潔ですね。
変更します。
0182お腹さん@名無しいっぱい。
02/03/06 01:21ID:???部分かなんかで使ってる?使ってなければ削除したりーナ!
$ENV{'TZ'} = "JST-9"; # Set timezone
@wdays = ( "sun", "mon", "tue", "wed", "thu", "fri", "sat", "sun" ); # Constant variables
018375とか
02/03/06 01:27ID:???全部elsifで繋ごうと思ったんですが、commentモードは終了後に掲示板に
戻らないとならないので別個のif文にしてその中でモードを変更するか
locationで飛ばさないとダメですよね??
0184お腹さん@名無しいっぱい。
02/03/06 01:52ID:???いいと思うケド、どのモードでもない場合(仕様がどうなのかわからないが)やcommonモード
でメッセージが空の場合などの対処も同時に「デフォルト処理」部分でしておく必要はあるネー。
;# URLデコード処理実行
;# ファイルロック実行
if ($in{'mode'} eq "comment" && $in{'message'} ){
commentモード処理;
}
elsif ($in{'mode'} eq "light"){
ligntモード処理;
}
elsif ($in{'mode'} eq "cellular"){
ligntモード処理;
}
;# デフォルト処理;
0186お腹さん@名無しいっぱい。
02/03/06 02:14ID:???018775とか
02/03/06 02:18ID:???0188お腹さん@名無しいっぱい。
02/03/06 02:21ID:???なぜか知らんがPOSTおよびGET送信を分けて書いてあるのでアル。
018975とか
02/03/06 02:23ID:???0190お腹さん@名無しいっぱい。
02/03/06 02:26ID:???書くほうがよりコンパクトで分かりやすいソースにあるってなもんだ!!
019175とか
02/03/06 02:37ID:???0192お腹さん@名無しいっぱい。
02/03/06 02:39ID:???read(STDIN, $_, $ENV{'CONTENT_LENGTH'}) unless $_= $ENV{'QUERY_STRING'};
019375とか
02/03/06 02:44ID:???一つの配列に両方入れるということですか?
0194お腹さん@名無しいっぱい。
02/03/06 02:46ID:???019575とか
02/03/06 02:50ID:???ところで、192は意味がわかりません。unless、それ以外は..。
0196お腹さん@名無しいっぱい。
02/03/06 02:51ID:???ないと思うが、これって思い違いカナ?
0197お腹さん@名無しいっぱい。
02/03/06 02:56ID:???で分割したそれぞれを更に=で分割してデコードをぶちかますから大枠は以下の
ようになるハズでアール。(チョット文字コード変換は置いといて)
for ( split('&') ){
nbsp; nbsp;($name, $_)= split('=');
nbsp; nbsp;tr/+/ /; s/%(..)/chr(hex($1))/eg; # URLデコード
nbsp; nbsp;$in{$name}= $_; # 値のセット
}
019875とか
02/03/06 02:56ID:???とかって入るんです。
0199お腹さん@名無しいっぱい。
02/03/06 02:58ID:???for ( split('&') ){
($name, $_)= split('=');
tr/+/ /; s/%(..)/chr(hex($1))/eg; # URLデコード
$in{$name}= $_; # 値のセット
}
0200nobodyさん
02/03/06 03:00ID:???<form action="hoge.cgi?foo" method="POST">
とかすると同時に送れたと思う。
0201お腹さん@名無しいっぱい。
02/03/06 03:02ID:???なるホードネー! それじゃー新たな必殺技を考えるからしばしお待ちを...
0202お腹さん@名無しいっぱい。
02/03/06 03:07ID:???read(STDIN, $_, $ENV{'CONTENT_LENGTH'});
$_.= "&$ENV{'QUERY_STRING'}";
020375とか
02/03/06 03:08ID:???0204お腹さん@名無しいっぱい。
02/03/06 03:10ID:???020575とか
02/03/06 03:22ID:???0206お腹さん@名無しいっぱい。
02/03/06 03:27ID:???わからんケド、経験上EUCで送信したHTMLフォームから入力された値はEUCの
URLエンコードで返ってくるのでSJIS送信の場合は必ずSJISのURLエンコード
で返ってくるのかチョットまだ試したことがないから取得パラメータの文字コードの解析
は必要なのかどうか迷うところネー。
020775とか
02/03/06 03:36ID:???0208お腹さん@名無しいっぱい。
02/03/06 03:39ID:???この際、内部処理はすべてEUCで、HTML出力はすべてSJISにしては?
なにかできない理由あったッケ?
020975とか
02/03/06 03:47ID:???全部SJISですか..。それが一番いいんですかね??文字化けしにくいですよね。
どっかの解説で、日本語使うならEUCだ!という知識を身に付けたので出力までEUCにしてただけです。
0210お腹さん@名無しいっぱい。
02/03/06 03:50ID:???経験上文字化けしたことがないし、文字コード変換のプロセスも必要なくなるし、
いいことづくめだとは思っています。
021175とか
02/03/06 03:58ID:???文字化けよりはいいかな。
ていうかEUCって文字化けしないんですか?
0212お腹さん@名無しいっぱい。
02/03/06 04:02ID:???021375とか
02/03/06 04:03ID:???さっきモードうんぬんを変更したせいで、
書き込み後のURLが?mode=commentのままになっている..
やっぱりLocationで飛ばしたほうがいいのかなあ。
021475とか
02/03/06 04:04ID:???0215nobodyさん
02/03/06 04:06ID:???foreach $line(@hoge_lines){
@超hoge=split(/<>/,$line);
&普通にhoge;
}
こういうのがありまして、
&普通にhogeというサブルーチンは
sub 普通にhoge{
名前:超hoge[0]
題名:超hoge[1]
}
となっているとします。
このルーチン内に別のログファイルの内容を読み込んでうまく組み込むにはどうすればよいのでしょうか?
0216お腹さん@名無しいっぱい。
02/03/06 04:09ID:???GET送信ならURLに?name=value&.... がくっつく(Location: 等で飛ばさない限り)
>214
Heavyモードってファイルには無いネー。これが隠し?
021775とか
02/03/06 04:14ID:???heavyが隠し(笑)。こっちは重いだけでいまのところ問題なしです。
0218nobodyさん
02/03/06 04:18ID:???@hoge_linesとログファイルの書式,
読み込んで組み込む時の上手い下手の定義とかを書いて。
0219お腹さん@名無しいっぱい。
02/03/06 04:19ID:???ネタかと思ったが...
0220nobodyさん
02/03/06 04:24ID:???0221お腹さん@名無しいっぱい。
02/03/06 04:34ID:???そうダネ。この板、最近ムネオが多いネ!
022275とか
02/03/06 04:38ID:???なんか、mode=commentとか全部postで送ったら、URLは簡潔だけど挙動がおかしいんです。
書き込み後、更新ボタンを押すと、重複して書き込まれてしまいます。
0223215
02/03/06 04:45ID:???@hoge_linesは
$name,$title
で
ログファイルの書式は
名前<>題名<>
こんな風です。
上手いはとにかくできでどんな形でも組み込めればおいしい。
下手は組み込みを失敗している状態のことでSU!
0224お腹さん@名無しいっぱい。
02/03/06 04:49ID:???print OUT join($SEPA,"$yy年$mm月$dd日","$jj時$ff分$bb秒",$in{'from'},
&nbps; $in{'message'}),"\n";
0225お腹さん@名無しいっぱい。
02/03/06 04:51ID:???224の &nbps; 部分はインデントミスさー
022675とか
02/03/06 04:55ID:???あと、splitのほう、^Kは\^Kと書かないとだめでした。
ちなみに、なぜ^Kなんでしょう??
takakura^kenさんからの書き込みあったらマズイ!
0227お腹さん@名無しいっぱい。
02/03/06 04:57ID:???これはコントロール文字のつもりだったので以下のように書き換えてみて、
$SEPA= "\x0b"; # セパレート文字(コントロール文字^K)
0228nobodyさん
02/03/06 05:06ID:???sub 普通にhoge{
名前:超hoge[0]
題名:超hoge[1]
特別なhuga;
}
sub 特別なhuga{
open LOGFILE, "logfile.dat";
while (<LOGFILE>) {
push @LOG, sub { {name=>$_[0],title=>$_[1]} }->(split /<>/);
}
close LOGFILE;
}
#$LOG[0]->{name}
022975とか
02/03/06 05:09ID:???^Kという文字列は僕のしょぼい検索に引っかかりませんでした..。
無知でお恥ずかしいです..
0230お腹さん@名無しいっぱい。
02/03/06 05:12ID:???る人がおおいけど、これだと2バイトになってしまうから、敢えて1バイトの
コントロール文字を使うという心意気みたいなもので、テキストデータを処理
する際の手筋ダーネ!
023175とか
02/03/06 05:19ID:???ところで、昨日教わったやり方だとデータファイルに<br>が入ってましたが、
これを例にならって^Rという勝手な区切り文字に変えてしまったんですが、
\x0bと同時に使って区別できる区切り文字ってありますか?
0232お腹さん@名無しいっぱい。
02/03/06 05:22ID:???\x1b ESC文字(コントロール文字^[)
023375とか
02/03/06 05:31ID:???ありがとうございます。
さて、そろそろ寝ます..最近、仕事中にしか寝てないんです(!)
2夜に渡って大変お世話になりました。どうもありがとうございました。
とりあえず明日全部sjis変換を試してみます..。
0234223
02/03/06 05:48ID:???logfile.datの方から読み込んだ名前の数をカウントして
もう一つの方から読み込んだ名前の横に表示しようとすると、
1に対する文句の数 2
2に対する文句の数 3
3に対する文句の数 5
と1に対する文句の数にそのまま+されていってしまいます。
これはどうやれば解決できるのでしょうか?
0235223
02/03/06 05:50ID:???と1に対する文句の数にそのまま+されていってしまいます。文句の数がね○
0236nobodyさん
02/03/06 05:57ID:???sub 特別なhuga{
@LOG = ();
〜以下略〜
■ このスレッドは過去ログ倉庫に格納されています