【Perl】初心者コーナー Part14
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/07/18 16:34ID:jemWJhH31:自分はこう言う事がしたい。
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あたりを見よう。
0694nobodyさん
02/08/01 19:29ID:???がJPEGの先頭のバイナリ。(たぶん。バイナリエディタで自分の持ってるJPEG画像開いて確認してくれ)
これが先頭にあるかを見る。
0695692
02/08/01 19:55ID:PoaI42Wkですよね〜
やっぱりSSIは動作してないかも、です。
でもCGI自体は動いているみたいで自分のアクセスしたログが
記録されてた。SSIが 使えないとダメなスクリプトのはずなのに、
なんでだろう・・・なんか混乱しちゃってます・・
0696nobodyさん
02/08/01 20:02ID:???port5.comがどういうところか知らないけど、そこのSSIではexecは許可されてるの?
0698692
02/08/01 20:43ID:???あ、多分解決しました。
port5.comはよく落ちるってことでレンタル鯖板ではすこぶる評判が
良いです。FAQのCGIのセクションばかりみていたんですけど、
他のところにSSIの説明ありました。回答して下さった方ありがとうございました。
0700nobodyさん
02/08/02 00:44ID:Sqea3lxU拡張子なんてアテになんないから、691は拡張子以外で、って書いてるんだろ
0702675
02/08/02 02:27ID:???スマソ、いまいち元データと完成後の画面イメージが掴めんので、
事情が理解出来ないのだが、原理的にはこんなんで行くはずだが。
実際には@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処理がこっちに帰って来ないのが不便でかないません.
外部プログラムを別プロセスで起動させることは出来ますか?
0705nobodyさん
02/08/02 10:32ID:HalM3U4I0706nobodyさん
02/08/02 10:43ID:???0707nobodyさん
02/08/02 11:05ID:???exec ですと、perl スクリプトが終わるので処理は返ってきません。
system ですと、forkしますから、別プロセスになります。
私は、
外部プログラムをperlの中から呼ばない
どうしても外部プログラムを使わないとダメな時は、そのためのシェルスクリプト
をperlに吐かせ、それを実行
するようにしてます。
0709nobodyさん
02/08/02 13:30ID:8kGCovezあれってどうやってるんでしょうか?
(アップした画像を縮小してるんじゃなくて、小さな画像を自動的につくる)
0711nobodyさん
02/08/02 15:01ID:???<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:???間違ってる。
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="hoge2" value="B">B
....
仮に連番でチェックボックスを生成しても、今度値を受け取る時
その数だけ
$hoge1 = $FORM{'hoge1'};
$hoge2 = $FORM{'hoge2'};
...
ってあらかじめ何個も用意しておかなきゃいけないんでしょうか。
(掲示板の投稿削除で管理者は一気チェックして消せるみたいな感じにしたいんです)
0716nobodyさん
02/08/02 15:21ID:???0717nobodyさん
02/08/02 15:32ID:???頭固い?
for(my$i=1;$i<=$last_number;$i++){
push(@hoge,$FORM{"hoge$i"});
}
とかで回せば楽だろう。
0718nobodyさん
02/08/02 15:33ID:???0720nobodyさん
02/08/02 15:42ID:???0721nobodyさん
02/08/02 15:52ID:???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++;
}
}
と配列に読み込むようにする。
0723nobodyさん
02/08/02 19:34ID:???0724712
02/08/02 20:41ID:???取得する時に変える方法は思いつかなかった。
どうせcgi-lib.plかなにかで取得させてるんだろうと思ったし
言っても分からないだろうから、下手に混乱させる必要もないかなと。
>721の発想出ないなんて、確かに頭固くなってて恥ずかしいね。
0726nobodyさん
02/08/02 23:15ID:+4MGC8XT2 こんな風にやってみた。
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:???RFCでCの方が書かれて
Cの方を使う人が多い。しまっていたから
0728726
02/08/02 23:31ID:???アリガトゴザイマス
RFC が解りません。
今調べてますが、差し支えなければ教えて下さい。
0729nobodyさん
02/08/02 23:43ID:???http://www.se.hiroshima-u.ac.jp/~isaki/rfc/list.html
インターネットの標準を定めている文書、といっても過言ではない。
たしかURIエンコードの項目に pack("C", hex($1)) が書かれてた。
0730728
02/08/02 23:49ID:fhO9IRlhありがとうございますです。
非常に参考になりました。
0731nobodyさん
02/08/03 00:24ID:4FNUCrqfFORMで打ち込んだ内容をテキストに保存する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__
0733730
02/08/03 00:34ID:???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 少ない環境での動作チェックはしましたが、同様の処理をしている
スクリプトを見かけないので、なんとなく不安が残ります。
何か問題点が有りそうでしたら、ご指摘下さい。
もちろん上記スクリプトは、意味が分かる程度に簡略化した物で動きませんよ?
0734731
02/08/03 00:43ID:4FNUCrqfありがとうございます!
でもサーバーエラーがでます。
なぜだろう・・ちゃんとパスやパーミッションも合ってるのに。
0735732
02/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:???を忘れてたからだ。
print<<"EOM";
のあとに
Content-Type: text/html<改行>
<改行>
入れてみて。
0737nobodyさん
02/08/03 00:55ID:???の直後に
local($name,$value) = split(/=/,$pair);
も忘れてた。
回線切って首(略
0738731
02/08/03 01:07ID:4FNUCrqf表示できました。
でも送信してもlog.txtに書き込まれないみたいです。
もうちょっとからかってみます。
0739nobodyさん
02/08/03 01:10ID:???漏れはからかわれていたのかΣ(゚д゚lll)
0740731
02/08/03 01:13ID:4FNUCrqfいやそういう意味じゃないです!すいません。
自分で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__
0742731
02/08/03 01:30ID:4FNUCrqfできました。
すごい勉強になりました。
感謝!
0743nobodyさん
02/08/03 06:08ID:???$value =~ s/%([0-9a-zA-Z]{2})/pack("H2", $1 )/eg;
これはいったいどういう処理をしているのでしょうか?
0744nobodyさん
02/08/03 08:11ID:yBArvQmy自分の所に携帯が無いのでどこを気をつけていいのか教えて頂けませんでしょうか?
Googleで6時間以上探し回っているんですがヒントすら見つかりません。
どなあたかご教授お願いします。
0745743
02/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携帯電話のローカルな情報をアップロードするって話なの?
どこに気をつけるとかいう以前にできるか否かは検討したのか。
>>745
perldoc -f pack すると
H A hex string (high nybble first).
とあるよ。
0747nobodyさん
02/08/03 10:09ID:y5M4ReYwhttp://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:???こちらの作ってるスクリプトもそれと同じような構造なのですが、
どうも自分のやろうとしている事はレコードを使わないといけないようですね。
ただ、検索してもレコードやリファレンスの構造がいまいちよく分からないんで、
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";
というような感じに代入させたいのですが。。
0752nobodyさん
02/08/03 21:54ID:???http://www.futomi.com/subroutine/ua.html
0753nobodyさん
02/08/04 01:18ID:8/YQ8REXフォームメールでローカルに有るファイルを添付させたいのですが、上手く出来ません。
送信したときにローカルファイルをサーバー上に一時ファイルでローカルファイルの
コピーを作成できないみたいなのです。
名前だけの空っぽのファイルができてそれが添付されてメールが届きます。
どうしたらファイルのコピーが作れるのでしょうか。
どなたかよろしくご教示ください。
0754nobodyさん
02/08/04 01:26ID:???0756755
02/08/04 01:36ID:FrE7nmXKまったく反映されず、どこが悪いのかも分かりません。
ご指摘お願いします。
0757756
02/08/04 01:37ID:FrE7nmXKif ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
$buffer = $ENV{'QUERY_STRING'};
}
$i = 0;
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
0758756
02/08/04 01:37ID:FrE7nmXK&jcode'convert(*name,'sjis');
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\r\n/<br>/g;
$value =~ s/\r/<br>/g;
$value =~ s/\n/<br>/g;
$value = $form{$name};
$name = $form{'name'};
$comment = $form{'comment'};
@num[$i]=$value;
$i=$i++;
}
0759nobodyさん
02/08/04 01:45ID:???0760756
02/08/04 01:47ID:FrE7nmXK知りませんでした。
スイマセン
0761753
02/08/04 01:55ID:8/YQ8REX下に書いてあるふうに、ファイル名を取得して空の同名のファイルをサーバ上の
指定したフォルダに作成してるんですが、その作ったファイルの中にデータを書き
こめないんです。
どうしたら良いかご教示いただけないでしょうか。
$filename = $FORM{$tenpu};
$c_type = 'Content-Type';
@tmp = split(/\\/, $filename);
$tmpfile = pop(@tmp);
$file_path = "./mail_tmp/$tmpfile";
open(OUT, ">$file_path");
while($tmp_byte=read($filename, $buffer, 1024)) {
print OUT $buffer;
}
close(OUT);
0762nobodyさん
02/08/04 02:16ID:???&jcode'convert(*value,'sjis');
&jcode'convert(*name,'sjis');
これは必要か? サーバ環境は?
0763nobodyさん
02/08/04 02:21ID:???$file_path = "./mail_tmp/$tmpfile";
$tmpfile に値ある?
mail_tmp のパーミッションは?
0764753
02/08/04 02:33ID:8/YQ8REXすみません、値というと・・・?
mail_tmpのパーミッションは777です。
0766753
02/08/04 02:40ID:8/YQ8REXこの空っぽのファイルが添付されて送られてきてしまいます。
0768753
02/08/04 02:55ID:8/YQ8REXif ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$buffer,$ENV{"CONTENT_LENGTH"});
}else{
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/&/&/g;$value =~ s/"/"/g;$value =~ s/\,/,\;/g;
$FORM{$name} = $value;
}
です。
それで761の処理以降はsendmailの処理になってます。
サブジェクトや添付ファイルのエンコードとかもそこでやってます。
0770753
02/08/04 03:03ID:8/YQ8REXもう1回やりなおしてみます。本当にありがとうございました。
0772クッキーのオンオフ
02/08/04 16:22ID:???ユーザー環境でクッキーのオンオフを確認し、
クッキーオフならhidden属性を表示しないようにしたいのですが、
クッキーのオンオフをその場で見極める方法などはありますでしょうか?
自分ではヘッダ情報でクッキーを書き出してから、$ENV{'HTTP_COOKIE'}で
再取得できればクッキーオンだと確認できると思っていたのですが、
クッキーを記録したその場では$ENV{'HTTP_COOKIE'}が更新されないようで
上手くいきませんでした。
クッキー保存と読み込みを別スクリプトで行なえばいいのですが、
それだとサーバーへのアクセスも増えますし、訪問者の人の
手間も増えてしまいます。
クッキーのオンオフをその場で確認する方法、
もしくは$ENV{'HTTP_COOKIE'}の再読み込みをする方法を
ご存知な方がいらっしゃいましたら、どうかご教授ください。
よろしくお願いします。
0773apholist
02/08/04 21:57ID:DUVpmc74いくつかのCGIで初期表示のあと、更新しようとすると
couldn't create child process: 22:
couldn't spawn child process:
というようなエラーが表示されます。何が原因だと
考えられますか?
0774nobodyさん
02/08/04 22:01ID:???UNIX専用の関数とか使ってない?
0775apholist
02/08/04 22:06ID:DUVpmc74あるかも。調べる方法ってあります?
0776apholist
02/08/04 22:27ID:DUVpmc74他にもありますか?
なかなかまとまったページがないっす。
0777nobodyさん
02/08/04 22:29ID:???どのプラットフォームでも動くようなCGI使えや。
0778apholist
02/08/04 22:49ID:DUVpmc74難しいこと言うなぁ。簡単なことなのか?
どのプラットフォームでもっていうと、
チャット、掲示板、カウンターなどほとんどWinでは
難しいような気がするんだけど。
まあ、Winで作られたものならWinで動くんだろうけど。
とりあえず、forkチェックしてみます。
「とか」って言ってるけどなんで知ってるの?常識?
0779apholist
02/08/04 23:00ID:DUVpmc74Some functions that work on Windows NT/2000 reportedly do not work or are buggy on Windows 95. An example is flock().
Certain functions don't seem to work on ActivePerl.
There are several functions that are unimplemented in the ActivePerl system. Here is a complete list of unimplemented functions:
Functions for processes and process groups
alarm(), getpgrp(), getppid(), getpriority(), setpgrp(), setpriority()
Fetching user and group info
endgrent(), endpwent(), getgrent(), getgrgid(), getgrnam(), getpwent(), getpwnam(), getpwuid(), setgrent(), setpwent()
System V interprocess communication functions
msgctl(), msgget(), msgrcv(), msgsnd(), semctl(), semget(), semop(), shmctl(), shmget(), shmread(), shmwrite()
Functions for filehandles, files, or directories
link(), symlink(), chroot()
Input and output functions
syscall()
Fetching network info
getnetbyname(), getnetbyaddr(), getnetent(), getprotoent(), getservent(), sethostent(), setnetent(), setprotoent(), setservent(), endhostent(), endnetent(), endprotoent(), endservent(), socketpair()
See the perlport and Win32 documentation pages for more information on the portability of builtin functions in ActivePerl.
だって。コピペしないほうがよかったか?
0780apholist
02/08/04 23:29ID:DUVpmc740782apholist
02/08/05 00:02ID:vCl4cuclごく簡単なCGIなら動きます。
掲示板も普通の?は動いたけど、megabbsスクリプトで
スレ立て後、レスを書き込もうとすると同じエラー。
0783nobodyさん
02/08/05 00:12ID:???0785nobodyさん
02/08/05 00:17ID:mlKhZTXHファイルポインタを使って円の面積を計算するプログラム、教えてください。
ファイルポインタには半径1から10の数値があります。
出力結果は次のようになるようにして下さい
半径 面積
1
2
3
・
・
10
0786apholist
02/08/05 00:26ID:vCl4cuclえ?ヤヴァイ?
0787apholist
02/08/05 00:29ID:vCl4cuclネタ?厨?For文使うか一つずつ円周率3で計算すればいいんじゃない。
0789nobodyさん
02/08/05 00:40ID:???>>785 おめー殴らせろ
0790apholist
02/08/05 00:41ID:vCl4cuclマルチだったのか。Perlとか言語の区別もつかんとは
あわれな厨だな。俺よりアフォだ。
とりあえず、うごきますた。Apache2.039が悪かったみたい。
1.326にしたら動いた。
人柱になるのはもっとスキルみがいてからにします。
ご協力感謝。
0791nobodyさん
02/08/05 01:57ID:LdtViypmhogeという文字列を追加したい場合
どう書けばいいですか
■ このスレッドは過去ログ倉庫に格納されています