【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あたりを見よう。
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という文字列を追加したい場合
どう書けばいいですか
0796nobodyさん
02/08/05 09:42ID:???$i=$i++;
はいかんよ
$a=0;
$b=$a++;
の場合は$a=1,$b=0.
$i=0;
$i=$i++;
なら$i=1,$i=0.どっちか分からん。
0797nobodyさん
02/08/05 10:21ID:???while(<>) {
next if !/_/;
s/^/hoge/;
}
ひとつの小難しい正規表現でやるのは嫌な人用。
0798nobodyさん
02/08/05 10:36ID:???よく見かけまずが、未だにperl4しか入ってないサーバばかりなんですか?
0799nobodyさん
02/08/05 11:28ID:???0800nobodyさん
02/08/05 11:37ID:7p5l2D2Kフォームメールでローカル上のファイルを添付して送信するスクリプトを作ったのですが、
パソコンのアウトルックではちゃんと添付ファイル付きのメールが受信できるのに
gooとかのウェブメールや、シグマリオンに付いているMPメールでは上手くいきません。
なにか違いでもあるんでしょうか。
どなたかご教示いただけないでしょうか。
0801nobodyさん
02/08/05 11:53ID:???0802nobodyさん
02/08/05 12:26ID:7p5l2D2Kgooでは件名、本文は正常に受信できて、添付の部分は本文にコードが書かれている状態です。
MPメールのほうは件名もiso-2022-jpと書かれていて、本文もcontent-type云々になってます。
パソコンのアウトルックで使うより、シグマリオンのMPメールで使う方が多いので困っています。
0803nobodyさん
02/08/05 13:47ID:???となってますか。
0804nobodyさん
02/08/05 14:55ID:???$ENV{'QUERY_STRING'}
の内容は1回目で無くなっちゃうんでしょうか。
うまくいかないんです。
そんなこたーないよ。コード見せてみ。
0806nobodyさん
02/08/05 14:59ID:???0807nobodyさん
02/08/05 16:02ID:???全体と載せるのは無理なんで説明します。
で、実は>721でやっているのをやりたいんです。
チェックボックスの値を配列で受け取るとういのを。
#usr/bin/なんたら
$FORM = &getparam; # パラメータ取得
$mode = $FORM{ mode };
if($mode eq "") { &main; }
〜モード判定〜
else { &error("不正なアクセスです。"); }
sub getparam{ # デコードサブルーチン
read( STDIN, $post, $ENV{ 'CONTENT_LENGTH' } );
@data = split(/&/,$post);
foreach $all (@data) {
($name,$value) = split(/=/,$all);
$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;
$value =~ s/>/>/g;
$value =~ s/\r\n|\r|\n/<br>/g;
$value =~ s/<br</<br>/g;
$FORM{$name} = $value;
if($name eq "no"){
push(@nos,$value);
}
}
@FORM
0808nobodyさん
02/08/05 16:02ID:???sub main{
foreach $hoge (@nos){
print "$hoge";
}
}
こうやるんですけど、何も表示されないんですね。
@FORMの配列しか受け取れていないんでしょうか。
最後の値を返り値にするから。
なんで
if($name eq "no"){
push(@nos,$value);
}
@nosの値を受け取るためだけのデコードルーチン作ったんですけど
それでもうまく値が返ってこないんですよね。
0810nobodyさん
02/08/05 16:19ID:???$ENV{ 'CONTENT_LENGTH' } でも値がなくなるこたーないよ。出力させてみ。
でも標準入力からは1度しか読み込めない。
0812nobodyさん
02/08/05 16:22ID:???0814nobodyさん
02/08/05 16:29ID:???そのソースは、記念に以下のスレにカキコしといてよ。
http://pc.2ch.net/test/read.cgi/php/1028052835/l50
0816nobodyさん
02/08/05 18:23ID:???_ _ .' , .. .. .' ∧_∧
∧ _ - ― = ̄  ̄`:, .∴ ' ・,‘∴ , . ( ) ←>>814
, -'' ̄ __――=', ・,‘ r⌒> _/ /
/ -―  ̄ ̄  ̄"'" . ’ | y'⌒ ⌒i
/ ノ | / ノ |
/ , イ ) , ー' /´ヾ_ノ
/ _, \ / , ノ
| / \ `、 / / /
j / ヽ | / / ,'
/ ノ { | / /| |
/ / | (_ !、_/ / 〉
`、_〉 ー‐‐` |_/
0817nobodyさん
02/08/05 18:24ID:???∧_∧ _ _ .' , .. .∧_∧
( ´_ゝ`) _ .- ― .= ̄  ̄`:, .∴ ' ( >>815)
/ '' ̄ __ ヽ´=', ・,' r⌒> _/ /
/ /\ / ̄\-―  ̄ ̄  ̄"'" . ' | y'⌒ ⌒\
_| ̄ ̄ \ / ヽ \_ | / ノ |
\ ̄ ̄ ̄ ̄ ̄ ̄ \__) , ー' /´ヾ_ノ
||\ \ / , ノ
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄ / / /
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄|| / / ,'
|| || .|| / /| |
!、_/ / 〉
0818802
02/08/05 20:15ID:???Content-Type: Multipart/Mixed;になっています。
もしかしてアウトルックはIEみたいに多少の間違いがあっても
上手いこと動いてくれてしまうんでしょうか・・・。
0819nobodyさん
02/08/05 20:16ID:???0820nobodyさん
02/08/05 21:37ID:TC4MSFf/書き込んでCGI上でリロードする際に、ページの下の方を表示したいんです。
表示と書き込みのCGIを分けて
書き込み側から
<META content=0;URL="read.cgi#sita" http-equiv=refresh>
こんな感じで飛ばしてみたんですが何故か#sitaが反映されません。
何かいい方法はないでしょうか。
0821nobodyさん
02/08/05 21:42ID:???書き込み後にLocationで飛ばせば?
0822nobodyさん
02/08/05 21:44ID:obWCEw8Y掲示板のログファイルを閲覧者からは見えなくしてCGIからだけ
読み込めるようにするにはどんなパーミッションにすればいいですか?
掲示板の削除キーが書き込んであるのが閲覧可能というのは、
やはりまずいかなと思いましてね。
いろいろ探したけどわからなかったので、知ってる方いたらお願いします。
まあ、ファイル名をわかりにくいものにする、などの方法はありますがね。
0823nobodyさん
02/08/05 21:50ID:TC4MSFf/やってみました。
print "Location:read.cgi\#sita\n\n";
こうですよね。
でもやっぱり#sitaは反映されないようです。
他に何か無いでしょうか…。
0824nobodyさん
02/08/05 21:57ID:???パーミッション変えるより、拡張子を.cgiにすれば?
>823
ページの読み込みが終わるまで待ってる?
その前にどこかクリックしたりすると移動しないことがあるよ?
あと、念の為に聞いておくけど、<a name=sita></a>で失敗していたりしないよね?
0825nobodyさん
02/08/05 22:06ID:TC4MSFf/>あと、念の為に聞いておくけど、<a name=sita></a>で失敗していたりしないよね?
そのとおりでした。穴があったら入れたいです。
ありがとうございました。
0826nobodyさん
02/08/05 23:12ID:???みんな仕事でやってるのか。
に、してはレベルが・・・。
0827m(__)m
02/08/05 23:25ID:7ewZSPimコミュニティサイトをしようかと思っているのですが、
メンバー表に登録するとクッキーが焼かれ、
掲示板などに書き込む時偽りができないようにできるスクリプトありませんか?
例を出すと、
http://daichanchi.com/
で利用しているようなものです。
よろしくお願いいたします。
0829nobodyさん
02/08/05 23:58ID:???>>827がたたかれるに1マルク
http://pc.2ch.net/test/read.cgi/php/1021897804/
0830nobodyさん
02/08/06 00:04ID:diugRf3e「writing」と表示されたのにかかわらず
if文の中が実行されません。
超初心者的なミスを犯していると思いますが、なにとぞご指摘ください。
ActivePerl: 5.6.0.620
Apache 1.3.24
Windows2000 +SP2
/* 以下 プログラム */
print "「$In{mode}」";
if ($in{mode} eq 'writing'){
print "hoge";
exit;
}
0832830
02/08/06 00:07ID:diugRf3eprint "「$In{mode}」";
if ($in{mode} eq 'writing'){
print "hoge";
exit;
}
本当は 「writing」hoge と表示して欲しいのに・・・
0833830
02/08/06 00:08ID:diugRf3eネタだと思われるようなミスなのですか(鬱)
どこがおかしいのか教えてください。
0834nobodyさん
02/08/06 00:09ID:???0835830
02/08/06 00:17ID:diugRf3e失礼しました〜っ
0836nobodyさん
02/08/06 00:21ID:???0837830
02/08/06 00:24ID:diugRf3ewritingはHTMLのフォームから渡されてきた物です。
mode=writing の時に書き込み処理をするようなBBSを
作っているのでした(笑)
こんな単純なことで3時間を費やした俺って一体(鬱)
そんなキミに-wスイッチとuse strict;をお勧めするよ。
慣れるまでちょっと時間は掛かるけど、
タイポによるつまらないバグが激減すること間違いなし!
0840art
02/08/06 10:10ID:a25IbhtN1.txt、2.txt・・という具合にファイルを生成したいんですが、
(1)テキストが保存されているディレクトリ内のファイルの数を調べ$prev内に代入
(2)*.txtの*をファイル数を$prev + 1にする。
(3)「($prev+1).dat」という名のファイルにする
という考え方でいいのでしょうか?
もし合っていればどういう風に書くかアドバイスして頂きたいのですが・・。
0841nobodyさん
02/08/06 10:19ID:???ナンバーを保存する別ファイルを作る。
0842nobodyさん
02/08/06 10:29ID:???0843nobodyさん
02/08/06 10:29ID:???0844843
02/08/06 10:30ID:???@hogeと@hage
これをさらに一つの配列にするしかないですか?
0846リファレンスを返す
02/08/06 10:38ID:???my ($hageR,$hogeR)=foo;
0847art
02/08/06 10:42ID:a25IbhtNナンバーを保存する別ファイルか・・
どうやるのですか
0848nobodyさん
02/08/06 10:52ID:???open(FIL,"a.txt");
$a = <FIL>;
close(FIL);
open(FIL,">a.txt");
print FIL ++$a;
close(FIL);
0849nobodyさん
02/08/06 10:56ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0850art
02/08/06 11:03ID:a25IbhtNなめてないよ。
そうじゃなくて、まずファイル生成する時にどうやってファイル名を
1.txt、2.txt、3.txt・・と増やして作ることが出来るかってこと。
■ このスレッドは過去ログ倉庫に格納されています