トップページ⇒php
1001コメント304KB

【Perl】初心者コーナー Part14

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/07/18 16:34ID:jemWJhH3
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
065259702/07/31 19:09ID:S7Hc+7gV
>598,599

ありがとうございました!
出来ました!!
0653nobodyさん02/07/31 19:13ID:GgEH/D5c
>>651
上にも書いてるじゃないか
$foo eq $bar
が真にならないのは$fooと$barの中身が違うからだよ
print 関数の使い方検索して出力してみろよ
もし、同じ文字列なのに偽になるんだったら
サーバの管理者に聞きなさい
0654>65102/07/31 19:24ID:???
http://www.afz.jp/~n_mattun/2ch/swf/R3_temp.swf?inputStr=%83_%83%81%82%C8%93z%82%CD%89%BD%82%F0%82%E2%82%C1%82%C4%82%E0%83_%83%81
0655comeoneverybody02/07/31 19:27ID:JJGI7Csk
>>644 さん
そそ、それです。
で、いまやってみましたら上手く行きました。
(\%header, $body, $html_body, 0, '../aa/1234.txt','../aa/1235.txt', '../aa/1236.txt');
これは上手くいくんですが、配列にしたときに上手くいかないんですよ。
0656nobodyさん02/07/31 19:32ID:qZ05OEOA
>>645
本当にUNIXだけでいいんですか?
出来れば理由を教えていただきたいです。

>>646
いえ、わからないです。
0657nobodyさん02/07/31 20:00ID:???
>>655
ホントに試したの?
$aa = '../aa/1234.txt'; $bb = '../aa/1235.txt';
(\%header, $body, $html_body, 0, $aa,$bb);
これならどうなるの?
配列の使い方知ってる?

>>656
それはクライアントの仕事だから、その為にContent-typeがあります
HTML書く時に一々ジャバスクリプト? でクライアントのOSを判定
しますか?
そんな事しなくてもクライアントがソースを見るとちゃんと置換されて
ますね
何故ならそれはブラウザちゃんのお仕事だからです
0658comeoneverybody02/07/31 20:18ID:JJGI7Csk
>>657さん
試しました。こっちは必死ですから。
本気でperl始めてまだ2週間です。
配列もなんとなく使ってはいたんですが。

@files=(@files,"'../aa/$form{$my}.txt',");
こんな感じで作ってます
0659comeoneverybody02/07/31 20:22ID:???
>>657さん
それも行けました
066063002/07/31 20:25ID:???
>>上にも書いてるじゃないか
>>$foo eq $bar
>>が真にならないのは$fooと$barの中身が違うからだよ
>>print 関数の使い方検索して出力してみろよ
>>もし、同じ文字列なのに偽になるんだったら
>>サーバの管理者に聞きなさい

出力しても同じ文字でした。ローカルでテストしてるので鯖管は自分です
0661 ◆JAPH9PWA 02/07/31 20:33ID:???
コレでも同じ?
print unpack('C*', $foo), "\n";
print unpack('C*', $bar), "\n";

066265702/07/31 20:37ID:???
>>658
ネタ?どう考えてもドキュメント読んだ方が早い
http://www.ie.u-ryukyu.ac.jp/~kono/perlman/cat1/perldata.html
@files = ('../aa/1234.txt','../aa/1235.txt', '../aa/1236.txt');
(\%header, $body, $html_body, 0, @files);
それとそのライブラリ、そのまま使うと何でも通すので
多分攻撃されます($form{$my})、ファイル消されます、入力チェック必須

>>660
良く読んで無いけど同じ文字列をeqで評価して真にならないなら
PERLかOSか機械が壊れてます。

0663nobodyさん02/07/31 20:48ID:???
>660
改行って目に見えないんだよな・・・。
0664comeoneverybody02/07/31 21:16ID:???
>>662
なんか間違っているということですか?

ドキュメント読んで出直します。

一応、パスワード入力+アクセス制限+外からアクセスできないディレクトリ
とか使って、セキュリティには気をつけてます。
0665comeoneverybody02/07/31 21:47ID:???
>>662
ひらめいたぽ
0666 02/07/31 21:52ID:???
おい>>630 、>>627 で解決した問題じゃないのか。
0667nobodyさん02/07/31 21:54ID:6r/wlS/6
>>664 は以下の文章の意味するところを勉強しろ。

それとそのライブラリ、そのまま使うと何でも通すので
多分攻撃されます($form{$my})
066863002/07/31 22:04ID:???
やっと原因がわかりました、、

プライベート変数myをifで囲んでいたためifから出たら空になってました

1回printで出力してみたのですがそのとき運悪くifの中にコーディングしたため
ちゃんと表示されてしまったということでした。

答えてくださった方ありがとうございました。>>627さんので当たりでした。
0669comeoneverybody02/07/31 22:06ID:???
>>662様
ありがとうございました。
@files=(@files,"../aa/$form{$my}.txt');
これでやってみようと思います。

キタ━━━━━(゚∀゚)━━━━━!!!!
解決しました。
本当にありがとうございました。
0670nobodyさん02/07/31 22:32ID:afTQxJxl
お金が無いので、
りゃま本、らくだ本、その他、
初心者向けの古本探して買おうかと思っていますが
最新版でなくてもよいでしょうか?
0671nobodyさん02/07/31 22:33ID:oq+m6OUN
>>657
それでは、<br>を改行コードに戻したい時は「\n」に置き換えれば
あとはどのOSで見ても勝手に改行してくれるという事ですよね?
0672nobodyさん02/07/31 23:02ID:???
>>670
古本屋にラクダ本がある素敵な場所があるなら教えて欲しいわ!(w
すれ違いなんで↓いきなさい
http://pc.2ch.net/test/read.cgi/php/988809842/
最新版じゃなくていいだろうが、、ラクダ2版は死んでも買えよ。
0673nobodyさん02/07/31 23:03ID:???
>>671  なんでそんな3分で試せる当たり前の事を聞くんだよ
改行されるに決まってるだろ。
それとも誰かにその事の補償でもさせたいのか、裁判官みたいだな
067467002/07/31 23:25ID:???
>>672さん
誘導ありがとうございます。
らくだ2版っと、メモメモ・・・

親に駄々こねて、買ってもらおうとしたら受験生なので却下されますた。
こんど、参考書を買うと騙してらくだ本買うように企んでいます(藁
お金欲しい・・・・
0675nobodyさん02/08/01 00:24ID:???
>>628,629
 $row_data{'NAME'} = $name;
 $row_data{'NICKNAME'} = $nickname;
 $row_data{'NICKNAMES'} = \@nicknames;
 push(@loop_data, \%row_data);
HTML::Templateのループネストって、普通でもややこしいのに、
もっと見通しの良い変数名を使ってホスィぞ。(外と内で同じ
%row_data を使ってるとか)
0676nobodyさん02/08/01 01:35ID:???
>>674
趣味の本くらい自分の小遣いためて買え・・・。
親にたかるなよ
0677nobodyさん02/08/01 04:41ID:???
>>675
ありがとうございます!!
ただ、>>629をループ処理すると、@loop_dataの中身はうまく表示されるんですが、
@nicknamesの部分は最後に入れたハッシュだけが適用されるようですね…
つまり、BobbyやHe-Manの部分をループ毎に変えても、結局最後に入れたハッシュの内容が
全てのNICKNAMESの部分に表示されると・・・。
0678nobodyさん02/08/01 07:48ID:M7oaAkIZ
スレ違いかもしれませんが質問です。
この意味がおわかりになる方いらっしゃいますか?
おそらく、telnet経由でread cgiにアクセスし、logから住人のアクセス情報を
出すということを言っているのだと思うのですが、実際現在そのようなことはできるのでしょうか?

http://tmp.2ch.net/test/read.cgi/mog2/1028122076/30-59
0679nobodyさん02/08/01 08:52ID:???
無理。
2ch全体でログ取ってすらいない。
何か起きたときだけ、緊急に取る。
0680nobodyさん02/08/01 09:00ID:???
>>673
windowsしかなくてunixやmacで試せないから聞いてるんだよ。
お前はプログラムしか能のない馬鹿か?
論理的に理解できてるならそれぞれの環境で試さなくてもわかるんだろうが
俺はお前のように論理的にわからないからいちいち自分で試せないことは聞いてるんだよ。
こんなことわざわざ説明しなきゃいけないなんて、だからプログラマー同士って良く対立してるんだね。
わかったら、KENTのlight.cgiはなぜ\rで置き換えているか説明しろ。
0681nobodyさん02/08/01 09:45ID:???
>>680
Windowsで試せばいいと思うが。
\nがUNIXでちゃんと表示されるのは当たり前。
\nがWinでOKならMacでもOKだろうと推測する頭を持て。
>KENTのlight.cgiはなぜ\rで置き換えているか説明しろ。
KENTがマカーだからだよ。

改行コードはどれにしてもIEやネスケではちゃんと表示される。
サーバがUNIX系ならUNIXの改行コードを使うのがいいんじゃないかということだな。
0682nobodyさん02/08/01 10:55ID:xj2aK3qv
>俺はお前のように論理的にわからないからいちいち自分で試せないことは聞いてるんだよ。
まず、論理的にわかるように努力しる! 個別に試してうんぬんなんて
無駄なこと。KENTがどうのなんて気にするな。人気があるのはイイ
スクリプトを書いているからじゃない。
0683nobodyさん02/08/01 11:22ID:???
>>643>>680

まぁまぁ。マターリしようYO。
そのテキスト形式のログを<pre>で囲んじゃ駄目なのか?
まともなブラウザなら改行コードにかかわらず表示できるYO。
0684nobodyさん02/08/01 12:35ID:???
>>680
やっぱり夏●だったんですね、謝ります。
改行コードの話はスレ違い、板違いなんで
超宇宙真理板にでも逝って下さい
0685nobodyさん02/08/01 12:46ID:???
>>680
ああ、妄想ファンタジーに突入してるんか

>KENTのlight.cgiはなぜ\rで置き換えているか説明しろ。
教えて欲しいならコード書け、KENTて誰だ?
まあ推測して書くと、そいつが馬鹿だからだな
perlの改行コードは\nなの、OSがUNIXだろうがマクだろうが
朝鮮人参だろうが関係無い
馬鹿以外の人間はんな事使って3日で気付くんだよな

馬鹿が馬鹿を見本に馬鹿なやり方で馬鹿妄想するから
普通の人間からドンドン遠ざかって行くんだよ
http://natto.2ch.net/denpa/
0686nobodyさん02/08/01 12:47ID:???
>俺はお前のように論理的にわからないから
お前は根本的に社会生活に問題が有ると思うね
0687nobodyさん02/08/01 12:57ID:???
復帰文字を使って改行するようなOSも、それを使うDQNも逝ってヨシだ。
>>680よこれを読め!!!
http://www2.gol.com/users/slowhand/kilmac/kilmac_i97.htm
0688nobodyさん02/08/01 13:44ID:???
なんか議論中のようなのですがチョト失礼シマスです
厨な質問なのですが、よろしければ答えてくださいです

SSIでデータをちょこちょこと処理させようとしたりしたときに
1HTML(?)中に2〜3回SSIを使ってたりすると処理の順番はどうなるのでしょうか?

↑から順に実行>完了されるのでしょうか
それとも↑から実行されて、完了しないうちに2番目のが実行されたりするのでしょうか

どうかご教授ください、宜しくお願いします
0689nobodyさん02/08/01 14:30ID:???
>>685
http://www.sankeipro.co.jp/male/kent_.htm
世界丸みえとかに良く出てるけど知らない?
プログラムやるのもいいけどたまにはテレビも見ようよ。
0690nobodyさん02/08/01 16:29ID:???
KENTがいっぱい

http://images.google.co.jp/images?q=KENT&hl=ja&lr=lang_ja&ie=UTF-8&inlang=ja&sa=N&tab=wi
0691nobodyさん02/08/01 18:52ID:zZ0lPm5t
こんばんは。行き詰まっていますのでどなたか教えて下さい。
jpeg画像をCGI_Lite.pmを利用してアップロードするCGIをperlで作成しているのですが、
アップする際に、アップされるファイルがjpegファイルかどうかを確認する方法が
わかりません。
拡張子で確認する以外の方法があれば教えて下さい。よろしくお願いします。
0692nobodyさん02/08/01 18:57ID:PoaI42Wk
お邪魔します。質問させてください。
port5.comにアクセスログ取得スクリプト設置したんだけど
htmlのソースにSSIのコメント<!--#exec cmd="..."-->ってやつが
ばっちり表示されてる。でもCGI/SSIは動いている模様。
これは普通のことなのですか?
ちなみにhypermartにも同じスクリプト置いてるけど、
こっちは表示されてないです。
0693nobodyさん02/08/01 19:25ID:???
>>691
バイナリで送られてきたデータ先頭を確認する。

>>692
表示されているのはおかしいぞ、と。
0694nobodyさん02/08/01 19:29ID:???
\xFF \xD8 \xFF \xE0 \x00 \x10 \x4A \x46 \x49 \x46 \x00
がJPEGの先頭のバイナリ。(たぶん。バイナリエディタで自分の持ってるJPEG画像開いて確認してくれ)
これが先頭にあるかを見る。
069569202/08/01 19:55ID:PoaI42Wk
>>693
ですよね〜
やっぱりSSIは動作してないかも、です。
でもCGI自体は動いているみたいで自分のアクセスしたログが
記録されてた。SSIが 使えないとダメなスクリプトのはずなのに、
なんでだろう・・・なんか混乱しちゃってます・・
0696nobodyさん02/08/01 20:02ID:???
>692
port5.comがどういうところか知らないけど、そこのSSIではexecは許可されてるの?
0697nobodyさん02/08/01 20:39ID:???
>>695
拡張子を確認!!
069869202/08/01 20:43ID:???
>>696
あ、多分解決しました。
port5.comはよく落ちるってことでレンタル鯖板ではすこぶる評判が
良いです。FAQのCGIのセクションばかりみていたんですけど、
他のところにSSIの説明ありました。回答して下さった方ありがとうございました。
0699nobodyさん02/08/01 20:47ID:???
>>692
多分.htaccess
0700nobodyさん02/08/02 00:44ID:Sqea3lxU
>>695

拡張子なんてアテになんないから、691は拡張子以外で、って書いてるんだろ
0701nobodyさん02/08/02 00:51ID:???
>>697
>>700
落ち着け。
070267502/08/02 02:27ID:???
>>677
スマソ、いまいち元データと完成後の画面イメージが掴めんので、
事情が理解出来ないのだが、原理的にはこんなんで行くはずだが。
実際には@name0と、@name1は、リファレンスを使用したレコード
構造とかにする必要が有るだろうけど。
foreach my $name (@name0){
 foreach my $nickname (@name1) {
  my %nickname;
  $nickname{NICKNAME} = $nickname;
  push(@nicknames, \%nickname);
 }

 my %name;
 $name{NAME} = $name;
 $name{NICKNAMES} = \@nicknames;
 push(@loop_data, \%name);
}
$tpl->param(ROW => \@loop_data);

<TMPL_LOOP NAME=ROW>
 <tr><td><TMPL_VAR NAME=NAME></td><td>
 <TMPL_LOOP NAME=NICKNAMES>
  <TMPL_VAR NAME=NICKNAME>
 </TMPL_LOOP>
 </td></tr>
</TMPL_LOOP>
0703nobodyさん02/08/02 06:04ID:Q2JtjWGI
execでもsystemでも,実行させた外部プログラムが終わるまで
処理がこっちに帰って来ないのが不便でかないません.

外部プログラムを別プロセスで起動させることは出来ますか?
0704nobodyさん02/08/02 06:05ID:???
>>703
0705nobodyさん02/08/02 10:32ID:HalM3U4I
チャットで、全員他の人を落とす方法教えてもらえませんか?
0706nobodyさん02/08/02 10:43ID:???
CGIファイルを消す。
0707nobodyさん02/08/02 11:05ID:???
>703
exec ですと、perl スクリプトが終わるので処理は返ってきません。
system ですと、forkしますから、別プロセスになります。

私は、
外部プログラムをperlの中から呼ばない
どうしても外部プログラムを使わないとダメな時は、そのためのシェルスクリプト
をperlに吐かせ、それを実行
するようにしてます。
070869202/08/02 13:09ID:???
>>699
正解です・・勉強してきますー
0709nobodyさん02/08/02 13:30ID:8kGCovez
画像アップ掲示板で、画像のサムネイルを自動的に作るものがありますが、
あれってどうやってるんでしょうか?
(アップした画像を縮小してるんじゃなくて、小さな画像を自動的につくる)
0710nobodyさん02/08/02 14:05ID:???
>>709
ここは【Perl】初心者コーナー ですが、読めませんか?
0711nobodyさん02/08/02 15:01ID:???
html---------
<input type="checkbox" name="hoge" value="A">A
<input type="checkbox" name="hoge" value="B">B
cgi----------
@hoge = $FORM{'hoge'};
foreach $value (@hoge){
print "$value";
}

チェックボックスの値を受け取りたいんですけど、AとB両方チェックしても
Aしか受け取れません。やり方間違ってますか?
0712nobodyさん02/08/02 15:03ID:???
>711
間違ってる。

nameを変えないとどちらかが上書きされる。
0713nobodyさん02/08/02 15:09ID:Blzo1x52
配列として、返ってくると予想していたんですけどこの考えは間違いですか?
チェックボックスの数は変動するんでnameを別にするとしたら
わざわざ適当な名前+連番とかで付けなきゃいけないって事ですかね。
0714nobodyさん02/08/02 15:10ID:???
配列としては取れない。
0715nobodyさん02/08/02 15:14ID:???
<input type="checkbox" name="hoge1" value="A">A
<input type="checkbox" name="hoge2" value="B">B
....

仮に連番でチェックボックスを生成しても、今度値を受け取る時
その数だけ
$hoge1 = $FORM{'hoge1'};
$hoge2 = $FORM{'hoge2'};
...
ってあらかじめ何個も用意しておかなきゃいけないんでしょうか。
(掲示板の投稿削除で管理者は一気チェックして消せるみたいな感じにしたいんです)
0716nobodyさん02/08/02 15:21ID:???
$FORM{'hogeN'};  を  $hogeN に代入する必要は無いんじゃないか?
0717nobodyさん02/08/02 15:32ID:???
>715
頭固い?
for(my$i=1;$i<=$last_number;$i++){
  push(@hoge,$FORM{"hoge$i"});
}

とかで回せば楽だろう。
0718nobodyさん02/08/02 15:33ID:???
基本的なことがわかってないヤツは何をやってもダメ
0719nobodyさん02/08/02 15:34ID:???
>>715

頭硬い
要領悪い
プログラマーに向いてません
0720nobodyさん02/08/02 15:42ID:???
バカだって、バカなりに生きていかなきゃならんし…。
0721nobodyさん02/08/02 15:52ID:???
>>711
hoge=A&hoge=B&hoge=C・・・・
上書きはされないで送られる。
読み込むときに
$count = 0;
my @pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
  my($name,$value) = split(/=/,$pair);
  if($name eq 'hoge') {
    $hoge[$count] = $value;
    $count++;
  }
}
と配列に読み込むようにする。
0722nobodyさん02/08/02 18:27ID:???
>>712

ハズカシー!
0723nobodyさん02/08/02 19:34ID:???
けど指摘できたの721だけだな。
072471202/08/02 20:41ID:???
>722
取得する時に変える方法は思いつかなかった。
どうせcgi-lib.plかなにかで取得させてるんだろうと思ったし
言っても分からないだろうから、下手に混乱させる必要もないかなと。
>721の発想出ないなんて、確かに頭固くなってて恥ずかしいね。
0725nobodyさん02/08/02 21:32ID:???
>>724
言い訳ハズカシー!!
0726nobodyさん02/08/02 23:15ID:+4MGC8XT
1 FORM から送信されたデータをデコードしたり、エンコードしたい。


2 こんな風にやってみた。

s/(\W)/'%'. (unpack(H2, $1))/eg;
s/%([a-fA-F0-9]{2})/pack(H2, $1)/eg;


3 いや、ふつうに動きますが、いくつか CGI の掲示板
Perl のスクリプトを公開しているサイトを拝見させて
頂きましたが、圧倒的に以下の様なスクリプトが幅を
利かせています。

s/(\W)/sprintf('%%%02X', unpack(C, $1))/eg;
s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

"C" で pack or unpack するメリットと、
"H2" で pack or unpack するデメリットを伺いたいのですが。

てゆーか "H2" のが効率良さそうな気がするのですが。



0727nobodyさん02/08/02 23:23ID:???
H2の方が効率がいい。
RFCでCの方が書かれて
Cの方を使う人が多い。しまっていたから
072872602/08/02 23:31ID:???
>727
アリガトゴザイマス

RFC が解りません。
今調べてますが、差し支えなければ教えて下さい。


0729nobodyさん02/08/02 23:43ID:???
RFCの日本語訳ならこの辺。
http://www.se.hiroshima-u.ac.jp/~isaki/rfc/list.html

インターネットの標準を定めている文書、といっても過言ではない。
たしかURIエンコードの項目に pack("C", hex($1)) が書かれてた。
073072802/08/02 23:49ID:fhO9IRlh
>729
ありがとうございますです。
非常に参考になりました。

0731nobodyさん02/08/03 00:24ID:4FNUCrqf
叩かれ覚悟で質問します。htmlもロクにわかってません。
FORMで打ち込んだ内容をテキストに保存するCGIを作ってます。
#!/usr/local/bin/perl
print<<"EOM";
<form action="./test.cgi" method="POST">
<input type=text name=sub size=50 value="$naiyou">
<input type=submit value="送信する">
</form>
EOM
open(OUT,">> log.txt");
print OUT "$naiyou";
close(OUT);

すいませんアドバイスお願いします。
0732nobodyさん02/08/03 00:29ID:???

とりあえず、送られてきたデータを受け取れ。
話はそれからだ。


#!/usr/bin/perl
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buffer);
foreach $pair(@pairs){
$value =~ tr/+/ /;
$value =~ s/%([0-9a-zA-Z]{2})/pack("H2", $1 )/eg;
$FORM{$name} = $value;
}

print<<"EOM";
<html>
<form action="./test.cgi" method="POST">
<input type=text name=sub size=50 value="naiyou">
<input type=submit value="送信する">
</form>
</html>
EOM
open(OUT,">>log.txt");
print OUT "$FORM{'sub'}";
close(OUT);
exit;
__END__
073373002/08/03 00:34ID:???
1 CGI 掲示板のログを、なるべく安全に保存したい。
2 "$/" INPUT_RECORD_SEPARATOR に "\n" を代入(する必要は多分無い)
"\r\n" を <br> に変換し "\r" "\n" を削除する。
"\r" をセパレータにしてデータを書き込む。
だいたいこんな感じ。
while($i < $log_countmax}){
 foreach(keys(%TMP)){$line .= "$_=$TMP{$_}\r";}
 push(@lines, $line);}

読み込み時には split にリミットを指定する事で文中の "=" は無視できる。
($key, $value) = split(/=/, $_, 2);

3 少ない環境での動作チェックはしましたが、同様の処理をしている
スクリプトを見かけないので、なんとなく不安が残ります。
何か問題点が有りそうでしたら、ご指摘下さい。
もちろん上記スクリプトは、意味が分かる程度に簡略化した物で動きませんよ?
073473102/08/03 00:43ID:4FNUCrqf
>>732
ありがとうございます!
でもサーバーエラーがでます。
なぜだろう・・ちゃんとパスやパーミッションも合ってるのに。
073573202/08/03 00:46ID:???
適当に書いたから(^^;
一応、データの受け取りはよく使われる。
↓こんなのが。

sub read_form {
local($pair,$buffer);
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}elsif($ENV{'REQUEST_METHOD'} eq 'GET'){
$buffer = $ENV{'QUERY_STRING'};
}
local(@pairs) = split(/&/,$buffer);
foreach $pair(@pairs){
local($name,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-zA-Z]{2})/pack("H2", $1 )/eg;
$FORM{$name} = $value;
}
0736nobodyさん02/08/03 00:51ID:???
Content-Type: text/html
を忘れてたからだ。

print<<"EOM";
のあとに
Content-Type: text/html<改行>
<改行>
入れてみて。
0737nobodyさん02/08/03 00:55ID:???
foreach $pair(@pairs){
の直後に
local($name,$value) = split(/=/,$pair);
も忘れてた。
回線切って首(略
073873102/08/03 01:07ID:4FNUCrqf
>>731
表示できました。
でも送信してもlog.txtに書き込まれないみたいです。
もうちょっとからかってみます。
0739nobodyさん02/08/03 01:10ID:???
>もうちょっとからかってみます。
漏れはからかわれていたのかΣ(゚д゚lll)
074073102/08/03 01:13ID:4FNUCrqf
>>739
いやそういう意味じゃないです!すいません。
自分でcgiをからかうという意味です。
変な言い方ですいません。
0741nobodyさん02/08/03 01:20ID:???
ローカルでテストしてみたけど、ちゃんと書き込まれてる。

#!/usr/bin/perl
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buffer);
foreach $pair(@pairs){
local($name,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-zA-Z]{2})/pack("H2", $1 )/eg;
$FORM{$name} = $value;
}

print<<"EOM";
Content-Type: text/html

<html>
<form action="./test.cgi" method="POST">
<input type=text name=sub size=50 value="naiyou">
<input type=submit value="送信する">
</form>
</html>
EOM
open(OUT,">>log.txt");
print OUT "$FORM{'sub'}";
close(OUT);
exit;
__END__
074273102/08/03 01:30ID:4FNUCrqf
>>741
できました。
すごい勉強になりました。
感謝!
0743nobodyさん02/08/03 06:08ID:???
すいません

$value =~ s/%([0-9a-zA-Z]{2})/pack("H2", $1 )/eg;

これはいったいどういう処理をしているのでしょうか?
0744nobodyさん02/08/03 08:11ID:yBArvQmy
携帯からファイルをアップロードできるCGIを作っているんですが、
自分の所に携帯が無いのでどこを気をつけていいのか教えて頂けませんでしょうか?

Googleで6時間以上探し回っているんですがヒントすら見つかりません。
どなあたかご教授お願いします。
074574302/08/03 09:10ID:???

s/%([0-9-zA-Z]{2})/pack("H2", $1 )/eg;

というのは %12 や %a7 などにマッチさせて
pack("H2",$1)というのに変換するということはなんとなくわかるんですが
このpack("H2",$1)というのは具体的に何をしているのか解説しているサイト
ないでしょうか?もしくはどなたか答えてくれる方いましたらよろしくお願いします。
0746nobodyさん02/08/03 09:36ID:f5spmMMH
>>744
携帯電話のローカルな情報をアップロードするって話なの?
どこに気をつけるとかいう以前にできるか否かは検討したのか。

>>745
perldoc -f pack すると
H A hex string (high nybble first).
とあるよ。
0747nobodyさん02/08/03 10:09ID:y5M4ReYw
>745
http://www.goo.ne.jp/default.asp?MT=perl+pack&act.search=%A1%A1%B8%A1%BA%F7%A1%A1&top=gtop&_v=2

0748nobodyさん02/08/03 12:08ID:???
>>702
こちらの作ってるスクリプトもそれと同じような構造なのですが、
どうも自分のやろうとしている事はレコードを使わないといけないようですね。
ただ、検索してもレコードやリファレンスの構造がいまいちよく分からないんで、
HTML::Template以外の方法を使うことにします。
それほどこのモジュールにこだわる必要もないんで・・・もうしわけない。
0749nobodyさん02/08/03 20:59ID:???

Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)

このようなエージェントを利用して使用ブラウザと使用OSを取得したいと考えています。
例えば上の場合だと

$browser = "IE 5.5";
$os = "Windows XP";

というような感じに代入させたいのですが。。
0750nobodyさん02/08/03 21:13ID:???
>>749
上の例だと、IEは5.01じゃないのか?
しかもOSも2000。
0751nobodyさん02/08/03 21:46ID:???
>>750

そうでした。
どうすればいいのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています