【Perl】初心者コーナー Part17
■ このスレッドは過去ログ倉庫に格納されています
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0132nobodyさん
02/10/19 15:31ID:???perlと格闘してますがぁ、
^Mがどうしても消せません!!!!!!!!!!!!!!!
^Mがどうしても消せないのです!!!!!!!!!!!!!!!
chompやchopでは
^Mがどうしても消せません!!!!!!!!!!!!!!!
どうやって消すのでしょうか?
0134nobodyさん
02/10/19 16:05ID:???perl -e 'BEGIN{}' -p ファイル名 引数
みたいに、-e 、-pを共存してかけますか?
0135nobodyさん
02/10/19 16:38ID:???できますか?
perldoc perlstyle
perldoc.jpなどに日本語訳あり
>>134
こういうこと?
perl -pe "..." file1 file2 ...
>>135
出来るけど、ブロックだと何か困ることでも?
f() while EXPR;
0137135
02/10/19 17:01ID:???あっ、そうだった・・・
質問間違えてた。EXPRが真なら処理A(ループ含む)をし、偽なら処理B(ループ含まない)なんてことできますかね?
べつにブロック使って困ることはありませんが、できそうになかったので敢えて質問してみました。
処理を関数にすれば、普通にifなり三項演算子なり使えば問題なさそうだけど。
sub A
{
ループする処理
}
sub B
{
ループしない処理
}
if(EXPR){
A()
}else{
B()
}
0141nobodyさん
02/10/19 17:55ID:M9PYtBQykiseiという配列があって、その中には数字のみのデータが入っているのですが
(こんな感じに→ @kisei=(256, 512, 4444); )
$idという変数にも何か数字が入っているとして、$idが@kiseiに含まれているかどうか
調べる為にはどうすれば良いでしょう?
やはりforeachで配列を回して探さなければいけませんか?
0143通行人さん@無名タレント
02/10/19 18:41ID:???ハッシュかな、、、、簡単にプログラムするなら
0144134
02/10/19 18:42ID:???-peではまとまって書かなければならないですよね。
そうではなくて、
-p hoge.pl
のhoge.pl内の変数に対し、
-e 'BEGIN{}'
で初期値の設定がしたいのです。
0145nobodyさん
02/10/19 19:04ID:???"─"
を含む行を消す時ってsedだと
sed /─/d
のように短く出来るけど、perlだと結構冗長にならない?
0147141
02/10/19 19:17ID:M9PYtBQyまじで?
0148nobodyさん
02/10/19 19:18ID:???perl -ibak -ne "print unless /―/"って感じかな?
sedみたいに特化してないから、仕方ないと思うけど。
0153デフォルトの名無しさん
02/10/19 20:38ID:???もっとまとめて簡潔に質問してください。
grep $id, @kisei;
rubykitchさんを調べてるのですか?
0155nobodyさん
02/10/20 07:05ID:???URLに使える文字以外をエスケープしようと思うのですが
下記のようにすると、記号の前に\が入ったりします。
(http://hogehoge.com/\~xxx/)
どうしたらいいでしょうか?
s|([^\w\[\];/\?:@&=\+$,-\.!~\*'\(\)])|'%'.unpack('H2',$1)|eg;
0156デフォルトの名無しさん
02/10/20 11:15ID:???rubykitchのidは、正規表現ラッパーになってると
聞いてるが、何か?
0157nobodyさん
02/10/20 21:52ID:???0158nobodyさん
02/10/20 23:20ID:S0+M+/Ux$total 全体
$A 求めるもの
$percent パーセント
おながいします。
0160nobodyさん
02/10/20 23:56ID:???0161nobodyさん
02/10/21 00:02ID:???0162nobodyさん
02/10/21 00:15ID:???$pai 円周率。
おなかしいます。
0163nobodyさん
02/10/21 00:18ID:???0164nobodyさん
02/10/21 00:30ID:???perldoc て日本語訳ありますこ?
0165nobodyさん
02/10/21 00:34ID:???0166nobodyさん
02/10/21 00:49ID:???http://perldoc.jpで日本語化が進行中
0168nobodyさん
02/10/21 15:22ID:???リファレンスの使い方は一応わかったんですけど、どんな時に使うのかがわかりません。
0169nobodyさん
02/10/21 16:08ID:???ちょっと高度なことをするとき。
よく使う場合はねぇ、
配列引数をサブルーティンに複数渡すとき、
多元配列を扱うとき、
ハッシュ変数にアクセスするとき、
だやね。
0170nobodyさん
02/10/21 16:34ID:???0171nobodyさん
02/10/21 16:47ID:???そのまま何も変えないで使うとデータファイルはaska.logです。
で、このlogファイルは投稿内容や暗号化された削除キーなどが記録されています。
そのlogファイルをブラウザからアクセスすると容易に閲覧できます。
投稿内容だけならともかく、投稿者のホスト名や暗号化された削除キーが載っています。
これはセキュリティ的に危険だと思うんですがこんなんでいいんでしょうか。
管理者以外にlogファイルを見られなくする方法は.cgiファイルにすれば見れないと
前に知りましたがこの方法が一番簡単なんでしょうか。
0173nobodyさん
02/10/21 17:23ID:nGDYlndqCGIで
パスワードを入力してボタンを押す
↓
パスワードが合ってるか? →エラーの為のHTML出力
↓(YES) (NO)
管理人しか見れない様なHTML出力
という風に同一CGI内でパスワードの処理をしたいんです。
んで、
<form action=\"$URL\" method=\"POST\">\n
<input type=\"hidden\" name=\"mode\" value=\"admin\">\n
<input type=\"password\" name=\"pass\" size=\"8\">\n
<input type=\"submit\" value=\"管理用\"></form>
というのを出力してみたのですが、
ここからパスワードを取得して、比べる→その結果によって出力っていうのがどうやったら良いのかわかりません。
どなかたご教授お願いします。
分からなければCGI.pmとかcgi-lib.plでも使え。
・分岐は if を使う。
・出力は print を使う。
0175173
02/10/21 17:30ID:nGDYlndqやってみます。
ありがとうございました。
0179_
02/10/21 18:01ID:???ログファイルの名前を分かり難い物に変える。
(英字と数字を組み合わせて「a5mhp3f」とか。)
パーミッション600等が使えれば600にしておく。
0180173
02/10/21 18:33ID:nGDYlndqcgi-lib.plの使い方はわかりました。
>>173の
<input type=\"submit\" value=\"管理用\">
この部分でできたボタンを押したことを感知するイベントハンドラ(?)みたいな処理にしないとマズいですよね?
そこを押したらpassを取得して比べるという事をしなければならないので。
そーいったのはどうすればできるのでしょうか?
0181nobodyさん
02/10/21 18:44ID:???> <input type=\"hidden\" name=\"mode\" value=\"admin\">\n
mode が admin な時に実行すれば?
0182nobodyさん
02/10/21 18:53ID:???パーミッション600だと読み込みが出来なくなっちゃうのでダメですよね。
結局見せたくないなら、手っ取り早くcgiファイルにしとけって事ですかね。
プロの人はどうやってるんでしょうか。
0183173
02/10/21 19:09ID:nGDYlndq%form = &read_input('euc');
$iptPass = $form{'pass'};
$mode = $form{'mode'};
if($mode eq admin){
# ---パスワード認証された時の処理
if ($iptPass = $PASS){
(略)
}
# ---パスワードが間違えてた時の処理
else{
(略)
}
}
>>181さんを参考にして、こんな風に付け足ししてみたんですけど、ダメでした。。。・゜・(ノД`)・゜・
もうちょっと詳しく解説して戴けますか?
>パーミッション600だと読み込みが出来なくなっちゃうのでダメですよね。
suexec対応の鯖使え。
共有鯖でsuexecでCGI動かしてない鯖は糞だから見限れ。
>結局見せたくないなら、手っ取り早くcgiファイルにしとけって事ですかね。
・見られたくないファイルはHTTP経由で見れないディレクトリに置く。
・suexecでCGIが動く鯖を使う。
・.htaccessでdenyる。
どれかにしる。
>>183
if ($iptPass = $PASS){
↓
if ($iptPass eq $PASS) {
だべさ。
0186173
02/10/21 19:56ID:nGDYlndqどうもありがとうございます。
でもできないです…。
0187173
02/10/21 20:05ID:nGDYlndqhttp://www.geocities.co.jp/SiliconValley-Sunnyvale/6220/chlog.zip
0188nobodyさん
02/10/21 20:18ID:???http://www.strangeworld.cx/cgi-bin/remix/bbs.cgi?area=soft15
0189nnd
02/10/21 21:51ID:j4V+CWpA$count =1;
$data = "$count" . ".html";
上のように自動に作成された1.htmlというファイルですが、
特定のフォルダ下に自動作成するにはどうしたらいいのでしょうか?
/html/1.html
という様にhtmlというフォルダの下に1.htmlというファイルを
自動的に作る場合はどのように指定してやればよいのでしょうか?
どなたかご教授お願いします。
0190nobodyさん
02/10/21 22:07ID:5oRhJ4R+open(FH,">./html/$count.html");
close(FH);
がむばれ
0191nobodyさん
02/10/21 22:13ID:???キミは決定的な勘違いをしている。
パスワード入力画面を出力したプロセスで
その結果を受け取れるワケがない。
ブラウザ「cgi呼び出し」
↓
CGI「パスワード入力画面出力」
↓
ブラウザ「パスワード入力画面表示」
これで1プロセス。ここでCGIの実行は終了。
この操作と同時に「CGIが吐き出したフォームに書き込まれる内容」を
CGI自身が受け取れるわけがない。
同じCGIの中でパスワードのチェックもしたいなら、
CGIが実行する一番最初の処理に
「パスワード付きの呼び出しが来たらこっちで処理」
という分岐をいれなければダメだ。
0192nobodyさん
02/10/21 22:17ID:???> 結局見せたくないなら、手っ取り早くcgiファイルにしとけって事ですかね。
> プロの人はどうやってるんでしょうか。
プロじゃなくっても、サーバいじれるなら、.datへのアクセスを
禁止しておくのが普通でしょ。
0193nobodyさん
02/10/21 22:26ID:5oRhJ4R+それか、httpでアクセスできないとこに設置するとか。
0194作ってみた
02/10/21 22:34ID:???これじゃだめか?
#!/usr/local/bin/perl
# パスワード
$pass='pass';
# このファイル名
$file='pass.cgi';
read(STDIN,$_,$ENV{'CONTENT_LENGTH'});
foreach (split(/&/)){
($name,$_)=split(/=/);
s/%([a-fA-F0-9][a-fA-F0-9])/pack('C',hex($1))/eg;
$input{$name}=$_;
}
print "Content-tyep:text/html\n\n<html><body>";
if($input{'pass'} ne ''){
if($input{'pass'} eq $pass){
print "本物";
}else{
print "偽者";
}
}else{
print '<form action="'.$file.'" method="POST"><input type="password" name="pass"><input type="submit"></form>';
}
print "</body></html>";
0195189
02/10/21 22:35ID:j4V+CWpA明日試して見ます。すいません。今日はもう寝させてくださいzzz
0197173
02/10/21 23:33ID:nGDYlndq難しい…。
何となく前半はわかったのですが、後半がよくわかりません。
もう少し考えさせてください。m(_ _)m
>>194
わざわざ作っていただいてありがとうございます。m(_ _)m
>print "Content-tyep:text/html\n\n<html><body>";
Content-tyepではなくて、Content-typeですよね?
でも、それを直してうpしても、エラーが出ちゃうんですよね…。(^^;
0198nobodyさん
02/10/22 00:27ID:???しとかないと大変なことになるよね。
パーミッションしっかりしてれば問題ないけど、それなら.cgiにする必要もないし。
0199173
02/10/22 00:29ID:EEwgqraoごめんなさい、エラーが出たのは私めのせいでございました。。。
パーミッションを変えないという初歩的なミスを…。
ちゃんと動きました、ごめんなさい。
敬具
0200nobodyさん
02/10/22 00:54ID:???いろいろな共有鯖で使う尼向け配付にはもってこいの気もする
・・・・・・・・・・なんだ結局尼むけだなぁ
仕事に使ったらAFOってことで
0201nobodyさん
02/10/22 02:35ID:???$_ = reverse($_);1
の1って何でしょう?
0202nobodyさん
02/10/22 02:44ID:???拡張子cgiて定石だけど、あくまでアマの定石ってこと?
でも「簡単に設定できる」というのは重要だと思うけど。
仕事でもそれは変わらないと思うんだけどな。
0205nobodyさん
02/10/22 04:15ID:???「.passwd」みたいに拡張子のみにリネームするのが定石じゃないの?FTPツールとかで。
まぁ鯖によっては置けなかったりFTPツールから見えなかったりするけど。
0206nobodyさん
02/10/22 07:04ID:???また、grep関数の良いところを述べてください。
0208nobodyさん
02/10/22 08:42ID:qoySgddo「拡張子のみ」とか言わないで「ドットファイル」と呼んだほうがかっこいいよ
0209nobodyさん
02/10/22 09:38ID:???http://www.google.co.jp/search?q=map%8A%D6%90%94&ie=Shift_JIS&hl=ja&lr=
http://www.google.co.jp/search?q=grep%8A%D6%90%94&ie=Shift_JIS&hl=ja&btnG=Google+%8C%9F%8D%F5&lr=
0210nobodyさん
02/10/22 11:52ID:???クエリーデータを取得して分解する時のこの行は何をしているんですか。
0211nobodyさん
02/10/22 12:31ID:???209にあるような%8A%D6%90%94という文字を、変換前の日本語や記号に戻してるんだよ。
URLデコードっていうんだよ。
0212nobodyさん
02/10/22 13:14ID:???わかりました。
0213nobodyさん
02/10/22 13:19ID:???open(HTML,"$url") || die "ダメ:$i";
while(<HTML>){
print;
}
close;
これエラーになるんですけどなぜでしょう。
0214nobodyさん
02/10/22 14:00ID:???0219173
02/10/22 17:06ID:1nArfp1iパスワードの部屋、>>194を発展させて作ろうと思ってます。
でも、>>191さんの
>同じCGIの中でパスワードのチェックもしたいなら、
>CGIが実行する一番最初の処理に
>「パスワード付きの呼び出しが来たらこっちで処理」
>という分岐をいれなければダメだ。
という所が理解できないので、サンプルソース戴けませんか?
わからないままってのはこれから困るし…。
どうかよろしくお願いします。m(_ _)m
0221nobodyさん
02/10/22 17:57ID:???教わったところで自分が何を実行してるのかわからないだろうから
こんなとこで「理解」はどのみち無理かと。
0222nobodyさん
02/10/22 18:25ID:???とりあえず、
> 「パスワード付きの呼び出しが来たらこっちで処理」という分岐
に相当する処理を>>194から探してみようよ。
0223nobodyさん
02/10/22 20:21ID:TiLNiSf4なのにどうしてスクリプト内のコメントは全部英語なんですか?
外国人のために英語で書いてあげてるんですか?
でも圧倒的に日本人が使う頻度が高いですよね?
それとも単なるかっこつけですか?
0224iui
02/10/22 20:34ID:qg3kIz94ぜひどなたかおしえ頂きたいのですが・・・
フォームのテキストエリア内での改行についてなのですが、
2CHに書き込みすると改行が生かされていますよね?
これはどのようにするのでしょうか?
WRAPとは違うのですよね?書き込みデータを出力しているときに
<br>が入っているのでしょうか?
面倒な質問ですがどなたかご存知の方いましたらよろしくお願いします。
0225iui
02/10/22 20:34ID:qg3kIz94テキストエリアに書かれた内容をメソッドポストで
write.cgiに送りdata.htmlに出力し、
それをread.cgiで表示しています。
具体的にはこうです。
==write.cgi==
$data = "data.html";
$name=$cgi{'name'}; #POSTで送られてきたデータ
$text=$cgi{'text'}; #POSTで送られてきたデータ
open(FILE, ">>$data") || &error("");
print FILE "<font size=\"2\">$name</font><font size=\"3\">$text</font>";
close(FILE);
==read.cgi==
open(FILE, "<$data") || &error("");
@lines=<FILE>;
close(FILE);
print @lines;
data.htmlを見ても文章に改行コードが入っていないので
改行する訳ないのですが・・・
テキストエリア内での改行コードを<br>に変換???
テキストエリア内の改行コードってどうやってみるの???
などなど、悩んでました。アホな悩みですがよろしくお願いします。
0226マジレスw
02/10/22 20:38ID:???一般的なPerlユーザならあの程度の英語は理解できるからです。
日本人Perlユーザの100人中99人は理解できます。
読めない1人(=223)が減っても、2人ぐらいなら海外から補填出来ます。
結局読める人は計101人で日本語で書くより読めるユーザが増えます。
0227マジレスw
02/10/22 20:45ID:???改行コードが入ってないってのがよく分からんが
-------------------------------------------------------------
$data = "data.html";
$name=$cgi{'name'}; #POSTで送られてきたデータ
$text=$cgi{'text'}; #POSTで送られてきたデータ
$text =~s{\x0D\x0A}{<br>}g;
$text =~s{\x0D}{<br>}g;
$text =~s{\x0A}{<br>}g;
open(FILE, ">>$data") || &error("");
print FILE "<font size=\"2\">$name</font><font size=\"3\">$text</font>";
close(FILE);
-------------------------------------------------------------
他にも<,>,",@とかもエスケープせんと酷い目に合うよ。
0229228
02/10/22 20:51ID:???0230nobodyさん
02/10/22 20:54ID:???文字コードの変換とかもしてなさそうな予感。
0231173
02/10/22 21:19ID:1nArfp1i参考にしようとしました。
kent-webのプチボードの管理モードの部分です。
j-code.plは使ってたけど、&read_inputを使ってなかったので、
&read_inputを使った他のソースが欲しいなって思った所です。
>>222
if($input{'pass'} ne ''){
# ↓ここから
if($input{'pass'} eq $pass){
print "本物";
}else{
print "偽者";
}
# ↑ここまでですよね?
}else{
print '<form action="'.$file.'" method="POST"><input type="password" name="pass"><input type="submit"></form>';
}
0232nobodyさん
02/10/22 21:20ID:???根本的に認識がずれてるからどう説明すればいいかとても悩みますね
ところで>>227の $text =~s{\x0D\x0A}{<br>}g; って初めて見たけど
$text =~s/\x0D\x0A/<br>/g; じゃだめなん
■ このスレッドは過去ログ倉庫に格納されています