トップページ⇒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あたりを見よう。
0077nobodyさん02/10/16 13:43ID:???
つーかさ、前から思ってたんだけど

open(F,"test.log");
my @log = (); push @log, $_ while <F>;
#@log = <F>;でもどっちでもいいよこの際。
close(F);
foreach(@log){
....
}

より

open(F,"test.log");
my $log = '';read(F,$log,-s "test.log");
close(F);
while($log =~ /\G([^\r\n]+)[\r\n]+/g){
....
}

とかにした方が全然速くない?
特に「ファイルを早く閉じたいから一気読みしてる」とか言ってる奴が
前者を使う理由がわからない。

#for$n($start..$end){$log[$n]の加工}とかで一部だけ
#加工したいなら読み込み段階で素直に
#while(<F>){$n++;next if($n < $start);last if($n > $end);$_の加工}
#とでもした方が全然速いし当然メモリはほとんど使わないし。
0078nobodyさん02/10/16 13:44ID:???
>76
ありがとうございます。
とりあえず今は数字しか必要ないので今のやり方でやります。
00797302/10/16 14:41ID:???
だからでかいファイルを一気にメモリに読み込むようなことはしないから、
それを前提にしたベンチやってても、その結果を考慮に入れる香具師は
いないってこと。
0080nobodyさん02/10/16 14:50ID:???
>>79
逆じゃないの?
一気にメモリに読み込む仕様にした時にでかいファイルを読まれたら
どうなるかは視野に入れて作った方が良いというか。
製作者の意図通りに使ってくれない人なんて沢山いるだろうし。
0081nobodyさん02/10/16 15:12ID:???
>>80
だからね、
「一気にメモリに読み込む仕様にした時にでかいファイルを読まれたら
どうなるかは視野に入れ」たら、普通そういう仕様にしないでしょ。
検討はしましたが、実際には使いませんね、でいいじゃん。

制作者の意図って誰の意図? Larryのことか?
00828002/10/16 15:35ID:???
>>81
落ちけつ。俺だってそんな仕様にはしないし
確かに普通そんな仕様にはしないだろう。

だがその話をしてる人は普通の用途では無いかもしれんし
実用云々は置いておいて単なる処理の話をしてるのかもしれん。
自分じゃまずやらない事だからこそ何か発見があるかもしれんし
色々話すだけなら構わんのでない?
0083nobodyさん02/10/16 15:49ID:???
置換演算子と変換演算子って似てると思うんですけどどこが違うんですか。
s/あ/ア/;
tr/あ/ア/;
これはどっちも同じですよね。
対象文字列に正規表現が使えるか使えないかの違いでしょうか。
0084nobodyさん02/10/16 15:56ID:???
>>83
下って

あの1バイト目とアの1バイト目
あの2バイト目とアの2バイト目

に置換。
0085nobodyさん02/10/16 17:30ID:???
最近、$CMD::form{'data'} みたいに、::を付けるソースが多いのですが
流行なんでしょうか?昔は見なかったような・・・
0086nobodyさん02/10/16 17:46ID:???
時代はPerl5ですよ。
0087nobodyさん02/10/16 18:44ID:???
昔か…
0088nobodyさん02/10/16 18:50ID:???
>>85は浦島さんですか?
0089nobodyさん02/10/16 20:34ID:???
>>77
>while($log =~ /\G([^\r\n]+)[\r\n]+/g){

\Gってなんですか?
あとテキストファイルの読み込みは<FILEHANDLE>が一般的と明言されてますけど
例にあるreadの方が本当に速いんですか?
0090nobodyさん02/10/16 20:56ID:???
>>89
\Gは前回マッチした場所の直後からスタート。
スピードは計ってみりゃいいじゃん。

#! /usr/bin/perl
open(LOG,">test.log");for(1..1000){print LOG 'a' x 1000 ."\n";}close(LOG);
use Benchmark;
timethese(50,{
  1=>q{
  open(F,"test.log");
  my @log = (); push @log, $_ while <F>;
  close(F);
  foreach(@log){next;}
  },
  2=>q{
  open(F,"test.log");
  my $log = '';read(F,$log,-s "test.log");
  close(F);
  while($log =~ /\G([^\r\n]+)[\r\n]+/g){next;}
  }
});
#Benchmark: timing 50 iterations of 1, 2...
#1: 22 wallclock secs (19.37 usr + 0.82 sys = 20.19 CPU) @ 2.48/s (n=50)
#2: 5 wallclock secs ( 3.37 usr + 1.01 sys = 4.38 CPU) @ 11.40/s (n=50)

0091nobodyさん02/10/16 21:44ID:???
>>89
readは読み込み専用に用意された関数だから、そりゃ速いだろ。
ファイルハンドルで回すのが一般的なのは扱いやすい、発展しやすいからじゃ
ないかな。(といってもreadで読むのは別に珍しくは無いと思うけど)
0092nobodyさん02/10/17 01:50ID:???
送信元ポートを指定してUDPパケットを発射したいんですけど、
どうやればいいんですかねえ?
0093nobodyさん02/10/17 03:57ID:???
配布されている掲示板のスプリクトをダウンロードして、
デザインを大幅に変えていた。
変え終わってローカルで最終テストをしている時に気づいた



パスワードが暗号化されていない・・。・゚・(ノД`)・゚・。

このままでは、ダメだと思い、別のところで配布されている
スクリプトに変えようかと思ったが、デザイン変えてしまったし、
折角だから、自分で暗号化してみようかと思い必死で暗号の仕方を探した。

何度も何度も試した。
エラーの繰り返し。

それから、12時間経過・・・(´Д`) =3

もう、別のスクリプト探すyoヽ(`A´)ノウワァン

こんなことなら、初めから別のスクリプトにしておけば良かった。
無駄な12時間だった・・・。(-_-)
0094nobodyさん02/10/17 08:19ID:???
>>93
パスワードの暗号化の部分だけ、別スクリプトからもらってきたら
よかったんじゃない? っていうかパスワード暗号化って必要な
ものなのか?
0095nobodyさん02/10/17 09:13ID:???
書き込み時に入力されたパスを crypt(パス,93)で暗号化して保存
記事変更・削除時に入力されたパスをcrypt(入力,93)使って暗号化、記録してある物と比較
一致すればOK   パスが記録されたファイルを見られても大丈夫

>>93 これじゃ駄目?
0096nobodyさん02/10/17 12:19ID:???
cryptがMD5な鯖でDESなcryptをシミュレートできますか?
0097nobodyさん02/10/17 15:52ID:???
>>94
>パスワード暗号化って必要なものなのか?

((((;゚д゚)))))
0098nobodyさん02/10/17 16:52ID:???
($buf_tmp,@lines)=$buf=~/[^\x0D\x0A]*\x0D?\x0A?/g;
を訳してください。
0099nobodyさん02/10/17 17:03ID:???
>>98
$buf の先頭から改行までを $buf_tmp にセット

以降を同様に配列 $lines にセット
0100nobodyさん02/10/17 17:06ID:???
>>99
ありがとうございます。
01019902/10/17 17:07ID:???
$lines ⇒ @lines
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は実際簡単じゃないか(藁
■ このスレッドは過去ログ倉庫に格納されています