CGIだけどなんか質問ある Pert 5.01
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/03/03 12:49ID:673UxTI50159nobodyさん
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 = ();
〜以下略〜
0237nobodyさん
02/03/06 07:01ID:CkyOD57Tもっと詳しく書いてやれYO!
0238nobodyさん
02/03/06 10:32ID:CkyOD57T0239ぷうすけ
02/03/06 11:05ID:qVBo2uea$ret=mkdir($fname,0777);
perlのcgiプログラム内にて、ディレクトリを上記の方法で作成して、その
中にデータファイルを作成する、というようなことをやろうとしています。
Webブラウザからのアクセスにより、上記の文は実行され、ディレクトリは作
成されます。$retには成功の1が返っていますが、実際のパーミッションは
755となっています。これは、サーバの設定のせいなのでしょうか?または、
なにかプログラム的に対策が取れますか?なお、cgiの置いてあるディレクト
リのパーミッションは777になっています。
0240nobodyさん
02/03/06 13:41ID:???多分サーバーの設定だろう。
詳しくは俺もよく知らんが、perldoc -f umask が参考になるかもしれない。
等と適当な事を逝ってみる。
0241nobodyさん
02/03/06 14:34ID:???ユーザーの入力を格納した %hoge と %foo で5,6列目を上書きし、
write.txtに保存したいです。
以下のように配列 @temp を一時利用したコードを書いたところ、
\tでjoinしたにも関わらず、タブ文字でなく「\t」を区切り文字に連結されました。
つまり、
print "@temp[0]\\t@temp[1]\\t@temp[2]\\t 〜 @temp[8]\\t\\n";
を実行した時と同じ結果になりました。
望む結果を得るにはどうしたらいいのでしょうか?
$counter=0;
open READ, "read.txt";
open WRITE, "+>write.txt";
while ($input = <READ>){
$counter++;
@temp = split (/\t/,$input);
@temp[5] = $hoge{$counter};
@temp[6] = $foo{$counter};
print WRITE join('\t',@temp) ;
}
close READ;
close WRITE;
0242nobodyさん
02/03/06 14:42ID:???'\t'
"\t"
この二つの違いはわかるかい?
0243242
02/03/06 14:50ID:???てかそれだけヒントをもらえれば自分で調べます。
0244nobodyさん
02/03/06 14:56ID:???君は241だろ。(w
まぁ、がんばれ。
頑張って無理だったらここを見ろ。
ttp://tohoho.wakusei.ne.jp/wwwperl1.htm#String
ttp://tohoho.wakusei.ne.jp/wwwperl1.htm#Esc
0245243
02/03/06 18:46ID:???024675とか
02/03/07 00:36ID:???&jcode::convert(\$value,"euc","","z");
これが動作してませんでした。第3引数がダメなようですが、何故でしょう??
それから、sjis用対策をいろいろ教わりましたが、例えば、発言者名が全部半角カナだと
getcodeの返り値がundefなので文字化け対策の部分は全部素通りしてたのでした。
実際携帯から書き込む人は何故か名前を全部半角カナで書く人が多いし、
本文も全部半角カナで書かれても困るので、フォームから漢字一文字をこっそり送って
その漢字コードに全部合わせることにしました。
若干不明な点を残しつつも文字化けにおびえる日々からは開放されました..。
0247nobodyさん
02/03/07 06:17ID:WTUe3Qf10248ぷうすけ
02/03/07 17:26ID:+Mtxnc4D<input type=password name='pass' size=8 maxlength=8>
<input type=submit name='button' value='認証'>
<input type=hidden name='data' value='hoge'>
</form>
perlのCGIにて、このようなHTMLを出力して、パスワードを
入力させようとしています。テストはWin2000 + IE5.5です。
パスワード用のテキストボックスにパスワードを入力して、
「認証」ボタンをマウスでクリックすると、正しく3つの要素が
QUERYとして送信されます。しかし、キーボードでEnterを押したり、
スペースバーでボタンを押したような場合、
name='button' value='認証'
の情報が、まったく送信されません。どうしてこのようなことに
なるのでしょうか?
最後に、ありがとうございました。>240さん
助かりました。
0249nobodyさん
02/03/07 17:31ID:???認証を押してないから。
0250ぷうすけ
02/03/07 18:08ID:+Mtxnc4D押したYO!!
0251nobodyさん
02/03/07 18:19ID:???0252nobodyさん
02/03/07 20:08ID:???submitタイプにname属性はありません。
つーか、パスワードをGETで送るな。
0255nobodyさん
02/03/07 20:48ID:???俺はWin2k+IE5.5SP2でちゃんと送れる。
マウスクリック、スペースキー、エンターキー全て正常に送れた。
0256nobodyさん
02/03/07 21:01ID:???0257nobodyさん
02/03/07 23:26ID:???0258nobodyさん
02/03/07 23:51ID:???やってみたらテキストフィールドでのEnterだけ入らなかった。
スペースでもEnterでも、ボタンを押せば送られる、という事かな。
ついでに、<input type="button" name="button" value="認証"> だと何やっても送られなかった。
仕様なのかな。
■ このスレッドは過去ログ倉庫に格納されています