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

【Perl】初心者コーナー Part17

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆Go4ZKngPGE 02/10/14 17:24ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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あたりを見よう。
01029602/10/17 17:25ID:???
放置されたので自分でぐぐって調べてみますた。
http://www.mikeneko.ne.jp/~lab/perl/des/
0103nobodyさん02/10/17 20:41ID:???
>>94
何度も別のスクリプトからもらってきて
試してみたんですが、無理でつた。
僕の知識不足です。
さすがに、生のパスワードがそのままログに
残ってしまうのは、もしも漏れた時に・・と考えると・・・。
それに、自分では来訪者のパスワードが見れてしまうので
気持ち悪いのです。。

>>95
わざわざ説明ありがとうございますた。
今試してみたのですが、記事削除時の比較がなかなか上手く
できないです。もう少し頑張ってみます。ペコリ
0104nobodyさん02/10/17 21:26ID:???
>>103
漏れないようにログは拡張子だけのファイルにしてしまいませう
0105nobodyさん02/10/17 23:44ID:???
漏れの姦違いですね・・・
吊るされに逝ってきます
0106nobodyさん02/10/18 01:16ID:eCvV6YKP
古くなったwin95マシンを鯖にしたんですが、アプロダを設置してテストしたところ、

Error 500
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:
"my" variable $year masks earlier declaration in same scope at C:\www\up\upload.cgi line 1366.
flock() is not available on Win95!

と出てしまったのですが、OSが95で flock() を含むスクリプトは使えないってことですか?
何か解決策はありませんでしょうか?
0107nobodyさん02/10/18 01:32ID:???
eval{ flock(); }
010810702/10/18 01:50ID:???
間違った

eval{ flock() };
010910602/10/18 01:58ID:???
>>107-108
できました!ありがとうございました。
0110nobodyさん02/10/18 13:52ID:lRuefofg
会員を募って会員にメールを送るシステムを作りたいんですけど、まず何から覚えるべきですか。
perlで作れるのは掲示板とかチャットとかです。
パスワード発行のやり方とかは知りません。
0111nobodyさん02/10/18 15:00ID:???
>>10
物事をチキンと説明、理解できる日本語
0112nobodyさん02/10/18 15:11ID:???
>>111 遅レスだなw
0113nobodyさん02/10/18 17:46ID:???
>>110
掲示板やchat作れるんならパスワード認証くらい簡単なはず。
一。<form action="hoge.cgi"></form>の中にメールアドレスとパスワードを入力する画面の設計。
二。hoge.cgiでメールアドレスとパスワードをファイルにかき出す。
三。メールアドレスを集めて、sendmailで用意したメール本文を送信。
ところで、パスワードは何に使うのかなぁ
0114名無しさん@カラアゲうまうま02/10/18 19:40ID:???
(゚Д゚)ハァ?
011511002/10/18 19:48ID:???
>>113
メールの送る内容(情報)を選べるようにしたいので、
会員登録後もIDとパスワードでログインして送信設定などを各会員にやってもらう予定なのです。

会員システムの時、IDとパスワードをユーザーが自分で決める方式と
IDは任意でパスワードは自動発行のだいたい二通りがあると思うんですけど
これってどっちがいいんでしょうか。別にどっちも大して変わらないんでしょうか。
0116超凄腕プログラマー02/10/18 20:22ID:???
ペリル程度でグダグダ質問してんじゃねぇよ!( ´,_ゝ`)プッ
0117nobodyさん02/10/18 22:04ID:XuCvNIce
何度試しても上手く行かないんですが、
CJ-CLUB の I-BOARD2001
のアイコンの種類と文字色の種類を増やしたいんですが、
set.cgi で増やしても
500 Internal Server Error
が出てしまいます。
他に書き換えなければならない部分があるのでしょうか?
エディタは秀丸とメモ帳でやってます。
改行は自分では入れていません。
0118nobodyさん02/10/18 22:30ID:???
改造工房逝けば?
0119nobodyさん02/10/18 22:31ID:???
>>117
どこをどうやったのか解らないので何も答えられません。
書き換えた部分と、その前後をコピペくらいしろ
0120nobodyさん02/10/18 23:08ID:???
>>115
自動発行ってトリップみたいなものかな?
実状は自分で決めたパスワードさえ忘れてしまう人が呆れるほど多かったりする罠。
自動発行だと忘れる人は倍増する気もするけど、
メールでしっかり忘れないようにするなら逆に忘れられても大丈夫かもしれない。
0121nobodyさん02/10/18 23:56ID:Ts+deQMH
ローカルでは動くのに、鯖にUPすると500エラーがでます。
どんな原因が考えられるでしょうか?
まったく見当がつかなくて困っています。
おながいします。
0122nobodyさん02/10/19 00:00ID:???
>>121
・CGIが使えない設定
・Perlやシェルの場合のパス違い
・パーミションの実行権なし
・アップロード時の文字コードまたは改行の設定ミスあるいはバイナリモードでアップした
0123 ◆hMJAPH9PWA 02/10/19 00:11ID:???
・必要なモジュールが存在しない
・環境依存なコードが書かれている
・Perlのバージョン
0124デフォルトの名無しさん02/10/19 00:45ID:???
・250台の鯖が死んでる。500もえらがとれたとはね。
0125nobodyさん02/10/19 00:53ID:SecGkhKp
正規表現にマッチした部分だけを変数に格納するには
どう書けばイイですか?
012612102/10/19 01:17ID:???
>>122-123
べんきょうになりますた。
>>124
すっげー根詰めてやってたから、和んだ(w

メールアドレスの@が犯人でした
ありがとうございました
0127rubyist@カラアゲうまうま02/10/19 09:13ID:???
>>121-126
糞言語に相応しい糞なやりとりだな。
0128デフォルトの名無しさん02/10/19 09:36ID:???
>>127
あんたさあ、糞言語の糞スレなんか読んでないで、
rubyスレでまともな発言したらぁ

0129nobodyさん02/10/19 09:51ID:???
>125
()で変数にしたい部分を囲む。
したら$1という変数に勝手に入る。
正規表現のとこに書いてあるだろ。
0130名無しさん@カラアゲうまうま02/10/19 15:26ID:5SBDqdQD
Perlのコーディング標準みたいなものってありますか?
0131nobodyさん02/10/19 15:28ID:???
>>130
1行目にPerlパスを書くことぐらいかな
0132nobodyさん02/10/19 15:31ID:???
教えてください。
perlと格闘してますがぁ、

^Mがどうしても消せません!!!!!!!!!!!!!!!
^Mがどうしても消せないのです!!!!!!!!!!!!!!!

chompやchopでは
^Mがどうしても消せません!!!!!!!!!!!!!!!
どうやって消すのでしょうか?
0133nobodyさん02/10/19 16:01ID:???
>>132
chop を2かいやれ
0134nobodyさん02/10/19 16:05ID:???
いまいち判らないので質問。

perl -e 'BEGIN{}' -p ファイル名 引数
みたいに、-e 、-pを共存してかけますか?
0135nobodyさん02/10/19 16:38ID:???
EXPR が 真なら、ループ処理を行なうコードをブロックを使わずに書くことって
できますか?
0136 ◆hMJAPH9PWA 02/10/19 16:46ID:???
>>130
perldoc perlstyle
perldoc.jpなどに日本語訳あり

>>134
こういうこと?
perl -pe "..." file1 file2 ...

>>135
出来るけど、ブロックだと何か困ることでも?
f() while EXPR;
013713502/10/19 17:01ID:???
>>136
あっ、そうだった・・・
質問間違えてた。EXPRが真なら処理A(ループ含む)をし、偽なら処理B(ループ含まない)なんてことできますかね?
べつにブロック使って困ることはありませんが、できそうになかったので敢えて質問してみました。
0138nobodyさん02/10/19 17:05ID:???
>>137
whileはEXPRが真の時しか実行されないんじゃ…
0139 ◆hMJAPH9PWA 02/10/19 17:20ID:???
>>137
処理を関数にすれば、普通にifなり三項演算子なり使えば問題なさそうだけど。

sub A
{
ループする処理
}
sub B
{
ループしない処理
}

if(EXPR){
A()
}else{
B()
}
014013502/10/19 17:24ID:???
>>139
やっぱりそうするしかないみたいですね。ブロックなしでは書けない処理もある
ということで・・・
0141nobodyさん02/10/19 17:55ID:M9PYtBQy
ちょっと質問があります。
kiseiという配列があって、その中には数字のみのデータが入っているのですが
(こんな感じに→ @kisei=(256, 512, 4444); )
$idという変数にも何か数字が入っているとして、$idが@kiseiに含まれているかどうか
調べる為にはどうすれば良いでしょう?
やはりforeachで配列を回して探さなければいけませんか?
0142nobodyさん02/10/19 18:38ID:???
>>141
うん
0143通行人さん@無名タレント02/10/19 18:41ID:???
>>141
ハッシュかな、、、、簡単にプログラムするなら
014413402/10/19 18:42ID:???
>>136

-peではまとまって書かなければならないですよね。

そうではなくて、
-p hoge.pl
のhoge.pl内の変数に対し、
-e 'BEGIN{}'
で初期値の設定がしたいのです。

0145nobodyさん02/10/19 19:04ID:???
例えば、
"─"
を含む行を消す時ってsedだと
sed /─/d
のように短く出来るけど、perlだと結構冗長にならない?

0146nobodyさん02/10/19 19:16ID:???
>>141
grepとか
014714102/10/19 19:17ID:M9PYtBQy
>>142
まじで?
0148nobodyさん02/10/19 19:18ID:???
sedは知らないけど、Perlだと
perl -ibak -ne "print unless /―/"って感じかな?
sedみたいに特化してないから、仕方ないと思うけど。
0149nobodyさん02/10/19 19:20ID:???
>>145
だから?
0150nobodyさん02/10/19 19:21ID:???
>>144
無理だと思うけど。
0151nobodyさん02/10/19 19:33ID:???
>>144 -pオプションの意味が分かってないだろ。
0152nobodyさん02/10/19 19:39ID:???
>>144
perl -e "...; require 'file'; ..."
0153デフォルトの名無しさん02/10/19 20:38ID:???
>>141
もっとまとめて簡潔に質問してください。
grep $id, @kisei;
rubykitchさんを調べてるのですか?
0154nobodyさん02/10/20 00:20ID:???
>>153
grep の使い方をお勉強しましょう。
0155nobodyさん02/10/20 07:05ID:???
prohostingを使っています。
URLに使える文字以外をエスケープしようと思うのですが
下記のようにすると、記号の前に\が入ったりします。
(http://hogehoge.com/\~xxx/)
どうしたらいいでしょうか?

s|([^\w\[\];/\?:@&=\+$,-\.!~\*'\(\)])|'%'.unpack('H2',$1)|eg;
0156デフォルトの名無しさん02/10/20 11:15ID:???
>>154
rubykitchのidは、正規表現ラッパーになってると
聞いてるが、何か?
0157nobodyさん02/10/20 21:52ID:???
Larry Wall はどうやら日本が好き見たいだ。

0158nobodyさん02/10/20 23:20ID:S0+M+/Ux
パーセント(百分率)を求める式を教えて下さい。

$total 全体
$A   求めるもの
$percent パーセント

おながいします。
0159nobodyさん02/10/20 23:55ID:???
>>158
パーセント=求めるもの÷全体×100

…
0160nobodyさん02/10/20 23:56ID:???
$percent= $A / $total * 100;
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:???
jperldoc
0166nobodyさん02/10/21 00:49ID:???
http://pc3.2ch.net/test/read.cgi/tech/1031838665/
0167 ◆hMJAPH9PWA 02/10/21 11:36ID:???
>>164
http://perldoc.jpで日本語化が進行中
0168nobodyさん02/10/21 15:22ID:???
すいま千円。
リファレンスの使い方は一応わかったんですけど、どんな時に使うのかがわかりません。
0169nobodyさん02/10/21 16:08ID:???
>>168
ちょっと高度なことをするとき。
よく使う場合はねぇ、
配列引数をサブルーティンに複数渡すとき、
多元配列を扱うとき、
ハッシュ変数にアクセスするとき、
だやね。

0170nobodyさん02/10/21 16:34ID:???
無名配列、無名ハッシュを使うときですね。
0171nobodyさん02/10/21 16:47ID:???
KENTのこの掲示板なんですけど、http://www.kent-web.com/bbs/aska.html
そのまま何も変えないで使うとデータファイルはaska.logです。
で、このlogファイルは投稿内容や暗号化された削除キーなどが記録されています。
そのlogファイルをブラウザからアクセスすると容易に閲覧できます。
投稿内容だけならともかく、投稿者のホスト名や暗号化された削除キーが載っています。
これはセキュリティ的に危険だと思うんですがこんなんでいいんでしょうか。
管理者以外にlogファイルを見られなくする方法は.cgiファイルにすれば見れないと
前に知りましたがこの方法が一番簡単なんでしょうか。
0172nobodyさん02/10/21 16:57ID:???
>>174
簡単だわな。確かに。
0173nobodyさん02/10/21 17:23ID:nGDYlndq
質問です。
CGIで
パスワードを入力してボタンを押す
  ↓
パスワードが合ってるか? →エラーの為の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>
というのを出力してみたのですが、
ここからパスワードを取得して、比べる→その結果によって出力っていうのがどうやったら良いのかわかりません。
どなかたご教授お願いします。
0174 ◆4/qmJJukCQ 02/10/21 17:27ID:???
・パスワードの取得はPOSTだから標準入力を解析する。
 分からなければCGI.pmとかcgi-lib.plでも使え。
・分岐は if を使う。
・出力は print を使う。
017517302/10/21 17:30ID:nGDYlndq
CGI.pmとかcgi-lib.plですか。
やってみます。
ありがとうございました。
0176nobodyさん02/10/21 17:47ID:???
>>172
おいレス番、違ってるだ炉。
誰に向かって言ってるんだ、はっきりしろ。
それによっては、どやす。
0177 ◆4/qmJJukCQ 02/10/21 17:49ID:???
>>176 174は実際簡単じゃないか(藁
0178nobodyさん02/10/21 17:57ID:???
>>177
納得。>>172はアフォ天才か
0179_02/10/21 18:01ID:???
>>171
ログファイルの名前を分かり難い物に変える。
(英字と数字を組み合わせて「a5mhp3f」とか。)
パーミッション600等が使えれば600にしておく。
018017302/10/21 18:33ID:nGDYlndq
すいません、もう一度…。
cgi-lib.plの使い方はわかりました。
>>173の
<input type=\"submit\" value=\"管理用\">
この部分でできたボタンを押したことを感知するイベントハンドラ(?)みたいな処理にしないとマズいですよね?
そこを押したらpassを取得して比べるという事をしなければならないので。
そーいったのはどうすればできるのでしょうか?
0181nobodyさん02/10/21 18:44ID:???
>>180
> <input type=\"hidden\" name=\"mode\" value=\"admin\">\n

mode が admin な時に実行すれば?
0182nobodyさん02/10/21 18:53ID:???
>>179
パーミッション600だと読み込みが出来なくなっちゃうのでダメですよね。

結局見せたくないなら、手っ取り早くcgiファイルにしとけって事ですかね。
プロの人はどうやってるんでしょうか。
018317302/10/21 19:09ID:nGDYlndq
# ---フォームのデータを受け取る
%form = &read_input('euc');
$iptPass = $form{'pass'};
$mode = $form{'mode'};

if($mode eq admin){
 # ---パスワード認証された時の処理
 if ($iptPass = $PASS){
  (略)
 }
 # ---パスワードが間違えてた時の処理
 else{
  (略)
 }
}

>>181さんを参考にして、こんな風に付け足ししてみたんですけど、ダメでした。。。・゜・(ノД`)・゜・
もうちょっと詳しく解説して戴けますか?
0184 ◆4/qmJJukCQ 02/10/21 19:16ID:???
>>182
>パーミッション600だと読み込みが出来なくなっちゃうのでダメですよね。
suexec対応の鯖使え。
共有鯖でsuexecでCGI動かしてない鯖は糞だから見限れ。

>結局見せたくないなら、手っ取り早くcgiファイルにしとけって事ですかね。
・見られたくないファイルはHTTP経由で見れないディレクトリに置く。
・suexecでCGIが動く鯖を使う。
・.htaccessでdenyる。
どれかにしる。

>>183
if ($iptPass = $PASS){
    ↓
if ($iptPass eq $PASS) {
だべさ。
0185nobodyさん02/10/21 19:32ID:???
>>183

if($mode eq 'admin'){
018617302/10/21 19:56ID:nGDYlndq
>>184-185
どうもありがとうございます。
でもできないです…。
018717302/10/21 20:05ID:nGDYlndq
一応全部の物をうpしましたので、どなたか教えて下さい。m(_ _)m
http://www.geocities.co.jp/SiliconValley-Sunnyvale/6220/chlog.zip
0188nobodyさん02/10/21 20:18ID:???
あやしいわーるどRemix@はじめてのPerl
http://www.strangeworld.cx/cgi-bin/remix/bbs.cgi?area=soft15
0189nnd02/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+
>>189
open(FH,">./html/$count.html");
close(FH);
がむばれ
0191nobodyさん02/10/21 22:13ID:???
>>173
キミは決定的な勘違いをしている。
パスワード入力画面を出力したプロセスで
その結果を受け取れるワケがない。

ブラウザ「cgi呼び出し」
↓
CGI「パスワード入力画面出力」
↓
ブラウザ「パスワード入力画面表示」

これで1プロセス。ここでCGIの実行は終了。
この操作と同時に「CGIが吐き出したフォームに書き込まれる内容」を
CGI自身が受け取れるわけがない。

同じCGIの中でパスワードのチェックもしたいなら、
CGIが実行する一番最初の処理に
「パスワード付きの呼び出しが来たらこっちで処理」
という分岐をいれなければダメだ。
0192nobodyさん02/10/21 22:17ID:???
>>182
> 結局見せたくないなら、手っ取り早くcgiファイルにしとけって事ですかね。
> プロの人はどうやってるんでしょうか。

プロじゃなくっても、サーバいじれるなら、.datへのアクセスを
禁止しておくのが普通でしょ。
0193nobodyさん02/10/21 22:26ID:5oRhJ4R+
>>192 まったくですなあ。データは.cgiに限りますね。
それか、httpでアクセスできないとこに設置するとか。
0194作ってみた02/10/21 22:34ID:???
>>173
これじゃだめか?

#!/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>";
019518902/10/21 22:35ID:j4V+CWpA
>190様どうもです。

明日試して見ます。すいません。今日はもう寝させてくださいzzz
0196nobodyさん02/10/21 23:24ID:???
>>192-193
cgiにするのはアマチュア。
1 httpでアクセスできないところに置く
2 .htaccessで禁止する
019717302/10/21 23:33ID:nGDYlndq
>>191
難しい…。
何となく前半はわかったのですが、後半がよくわかりません。
もう少し考えさせてください。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にした場合、たとえば掲示板なら書き込みの汚染チェックしっかり
しとかないと大変なことになるよね。
パーミッションしっかりしてれば問題ないけど、それなら.cgiにする必要もないし。
019917302/10/22 00:29ID:EEwgqrao
拝啓 >>194様

ごめんなさい、エラーが出たのは私めのせいでございました。。。
パーミッションを変えないという初歩的なミスを…。
ちゃんと動きました、ごめんなさい。

                                     敬具
0200nobodyさん02/10/22 00:54ID:???
批判の多い.cgi。
いろいろな共有鯖で使う尼向け配付にはもってこいの気もする
・・・・・・・・・・なんだ結局尼むけだなぁ
仕事に使ったらAFOってことで
0201nobodyさん02/10/22 02:35ID:???
良く見かける、
$_ = reverse($_);1
の1って何でしょう?
■ このスレッドは過去ログ倉庫に格納されています