【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あたりを見よう。
0040nobodyさん
02/10/15 14:42ID:0TY8yVdTありがとうございます。解決しました。
すみやかに回線切って逝ってまいります。
0041nobodyさん
02/10/15 15:07ID:1tgEM8TW自分で作れっていわれそうですが、先人のプログラムがあれば是非利用してみたいです。
英単語をカウントするものはごろごろ落ちてるんですが、日本語のものってちょっと見つからなくて困っています。
例)
一番は一番で三番は四番。
↓
一番 2
三番 1
四番 1
0042nobodyさん
02/10/15 15:09ID:???0043nobodyさん
02/10/15 16:08ID:???ひらがなで単語を区切る?
じゃあ、これはどうよ。←
「これはどうよ」が一単語かよ。
日本語を単語に区切るにはchasenなどの形態素解析ソフトが必要。
004441
02/10/15 16:45ID:???ご返答ありがとうございます。
茶筅も調べてみたのですが、細かく区切り過ぎてしまうようです。
一連の単語として区切るようなオプションがあれば一番なのですが。。
茶筅例)
拉致被害者→拉致 被害 者
拉致被害者→拉致被害者の一単語としてカウントしたい。
そこで、ひらがな、もしくは記号(、。「」等)で区切ることができればと考えています。
あくまで漢字、カタカナのみで、ひらがなの単語はカウントしないと考えています。
0045nobodyさん
02/10/15 16:51ID:???「これはどうよ」はさ、「これは どうよ」なのか「これ はどうよ」なのかの判断はどうさせる気よ?
すでにPerlの問題でもない気がするけど。
こないだ見たプロジェクトXのワープロ開発の話を思い出したさ。
004642
02/10/15 16:52ID:???文字コード書いてないからSJIS対応で書いた。不完全だけと十分だろ。
map($set{$_}++, split(/(?:\x82[\x9f-\xf1])+/));
0048login:Penguin
02/10/15 19:40ID:???また、PerldBIで構築したサイト教えて下さい
また、強化書ですが、 oreilly の perl dbi が
がいいですか
それともascii のperl DBIの本がいいですか?
0049nobodyさん
02/10/15 20:18ID:???http://pc.2ch.net/test/read.cgi/php/1030209573/
0050nobodyさん
02/10/15 20:34ID:???push@log,$_ while<LOG>;
と
@log=<LOG>;
とで、スピード的、メモリ的な違いは出ませんかね。
調べられないもので。
005351
02/10/15 20:46ID:???スピードは大差ない
Benchmark: timing 1000 iterations of code1, code2...
code1: 1 wallclock secs ( 1.43 usr + 0.00 sys = 1.43 CPU)
code2: 2 wallclock secs ( 1.43 usr + 0.00 sys = 1.43 CPU)
005450
02/10/15 20:51ID:???じゃぁメモリに優しそうな前者を使うのがベターってことですかね。
0057nobodyさん
02/10/15 23:01ID:???何を測りたいベンチなの?
意味のある数字が出ていない気がするが。
--- bench ---
#!/usr/bin/perl
use Benchmark;
timethese( 5, {
handle => q{
open F, '<./test.log' or die;
my @log = (); @log = <F>;
close F;
},
while1 => q{
open F, '<./test.log' or die;
my @log = (); push @log, $_ while <F>;
close F;
},
while2 => q{
open F, '<./test.log' or die;
my @log = (); while (<F>) { push @log, $_ }
close F;
},
});
__END__
> perl -e 'print map { "$_\n" } (0..999_999);' > test.log
> perl bench
Benchmark: timing 5 iterations of handle, while1, while2...
handle: 19 wallclock secs (14.92 usr + 3.61 sys = 18.53 CPU)
while1: 10 wallclock secs (10.52 usr + 0.19 sys = 10.70 CPU)
while2: 12 wallclock secs (11.11 usr + 0.13 sys = 11.24 CPU)
005850
02/10/15 23:56ID:???おおう。省略形のwhileが最速ってことですかこれは。
省略形の方が速いんすね。
そして @log = <F> が一番遅いとは思いませなんだ。
結論として push @log, $_ while <F>; っていう記述が一番よろしいカンジですか。
0060nobodyさん
02/10/16 01:13ID:???0061nobodyさん
02/10/16 02:10ID:???ベンチを競うほどでもないし、自分が好きなやり方でやったほうがいい。
やり方は何通りもあるってやつです。
速度が気になるのなら、
while (<LOG>) {
処理
}
とやるか、いっそCで書き直すというほうがマシでしょ。
006257
02/10/16 04:13ID:???>>57 の数字を信じるなら、100万行*5で せいぜい10秒の差だ。
数千行のファイルをたまに触るだけの人が気にしなきゃいけない
数字じゃない。しかし日常的に数十万行のファイルを*Perlで*
扱っているなら、知っておくべき実験結果だろうな。
やり方は色々ある。どんな風に書くも自由だ。
だけど状況によって最適解は変わる事を常に意識しなきゃだめだ。
0063nobodyさん
02/10/16 05:58ID:???0064nobodyさん
02/10/16 07:32ID:???まあ、数十万行のファイルを触るときに数千行と同じやりかたをするのか?って疑問を
もって欲しいもんだ。
# しかもそれが日常的な場合だと特に。
0065nobodyさん
02/10/16 07:42ID:???普通に効率のいい方を使えばいいっていうだけの話ちゃうの
0067nobodyさん
02/10/16 11:11ID:???localtime の逆関数みたいのないですか?
$year $mon $mday $hour $min $sec --> $epoc にしてくるようなの。
0068nobodyさん
02/10/16 11:28ID:4mkRoll6use Time::Local;
$epoc = &timelocal($sec, $min, $hour, $mday, $mon, $year);
0069nobodyさん
02/10/16 11:36ID:4mkRoll6補足
年は4ケタ(2002とか)、それ以外はlocaltimeと同じでつ。
曜日は求めた値をlocaltimeにかけると分かるです。
不正な値はエラーになっちゃうんでうまく対策してください。
007167
02/10/16 12:01ID:???ありがとうございます。
助かります。
007251
02/10/16 12:58ID:???>何を測りたいベンチなの?
>意味のある数字が出ていない気がするが。
前レスを受けてのベンチだからわかると思ったんだけど・・・
意味のある数字? timing 1000 でとったんだけど・・・
0073nobodyさん
02/10/16 13:15ID:???だからさ、高負荷をかける状況になる場合、ファイル丸ごと変数に取り込む
ようなことしないよね。ってことから意味のある数字かどうか考えたらいいんじゃないか?
東京大阪間を最短で歩くコースを考えてくれても、「なんで新幹線乗らないの?」って
言われたらおしまい。これと同じこと。
0074nobodyさん
02/10/16 13:27ID:???$hoge =~ s/0/0/g;
$hoge =~ s/1/1/g;
$hoge =~ s/2/2/g;
これを9まで続けるでいいでしょうか。
0076nobodyさん
02/10/16 13:40ID:???ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Z2H
まぁ、そのやり方が一番楽だと思うよ。
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:???ありがとうございます。
とりあえず今は数字しか必要ないので今のやり方でやります。
007973
02/10/16 14:41ID:???それを前提にしたベンチやってても、その結果を考慮に入れる香具師は
いないってこと。
0080nobodyさん
02/10/16 14:50ID:???逆じゃないの?
一気にメモリに読み込む仕様にした時にでかいファイルを読まれたら
どうなるかは視野に入れて作った方が良いというか。
製作者の意図通りに使ってくれない人なんて沢山いるだろうし。
0081nobodyさん
02/10/16 15:12ID:???だからね、
「一気にメモリに読み込む仕様にした時にでかいファイルを読まれたら
どうなるかは視野に入れ」たら、普通そういう仕様にしないでしょ。
検討はしましたが、実際には使いませんね、でいいじゃん。
制作者の意図って誰の意図? Larryのことか?
008280
02/10/16 15:35ID:???落ちけつ。俺だってそんな仕様にはしないし
確かに普通そんな仕様にはしないだろう。
だがその話をしてる人は普通の用途では無いかもしれんし
実用云々は置いておいて単なる処理の話をしてるのかもしれん。
自分じゃまずやらない事だからこそ何か発見があるかもしれんし
色々話すだけなら構わんのでない?
0083nobodyさん
02/10/16 15:49ID:???s/あ/ア/;
tr/あ/ア/;
これはどっちも同じですよね。
対象文字列に正規表現が使えるか使えないかの違いでしょうか。
0085nobodyさん
02/10/16 17:30ID:???流行なんでしょうか?昔は見なかったような・・・
0086nobodyさん
02/10/16 17:46ID:???0087nobodyさん
02/10/16 18:44ID:???0089nobodyさん
02/10/16 20:34ID:???>while($log =~ /\G([^\r\n]+)[\r\n]+/g){
\Gってなんですか?
あとテキストファイルの読み込みは<FILEHANDLE>が一般的と明言されてますけど
例にあるreadの方が本当に速いんですか?
0090nobodyさん
02/10/16 20:56ID:???\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:???readは読み込み専用に用意された関数だから、そりゃ速いだろ。
ファイルハンドルで回すのが一般的なのは扱いやすい、発展しやすいからじゃ
ないかな。(といってもreadで読むのは別に珍しくは無いと思うけど)
0092nobodyさん
02/10/17 01:50ID:???どうやればいいんですかねえ?
0093nobodyさん
02/10/17 03:57ID:???デザインを大幅に変えていた。
変え終わってローカルで最終テストをしている時に気づいた
パスワードが暗号化されていない・・。・゚・(ノД`)・゚・。
このままでは、ダメだと思い、別のところで配布されている
スクリプトに変えようかと思ったが、デザイン変えてしまったし、
折角だから、自分で暗号化してみようかと思い必死で暗号の仕方を探した。
何度も何度も試した。
エラーの繰り返し。
それから、12時間経過・・・(´Д`) =3
もう、別のスクリプト探すyoヽ(`A´)ノウワァン
こんなことなら、初めから別のスクリプトにしておけば良かった。
無駄な12時間だった・・・。(-_-)
0094nobodyさん
02/10/17 08:19ID:???パスワードの暗号化の部分だけ、別スクリプトからもらってきたら
よかったんじゃない? っていうかパスワード暗号化って必要な
ものなのか?
0095nobodyさん
02/10/17 09:13ID:???記事変更・削除時に入力されたパスをcrypt(入力,93)使って暗号化、記録してある物と比較
一致すればOK パスが記録されたファイルを見られても大丈夫
>>93 これじゃ駄目?
0096nobodyさん
02/10/17 12:19ID:???0098nobodyさん
02/10/17 16:52ID:???を訳してください。
010199
02/10/17 17:07ID:???010296
02/10/17 17:25ID:???http://www.mikeneko.ne.jp/~lab/perl/des/
0103nobodyさん
02/10/17 20:41ID:???何度も別のスクリプトからもらってきて
試してみたんですが、無理でつた。
僕の知識不足です。
さすがに、生のパスワードがそのままログに
残ってしまうのは、もしも漏れた時に・・と考えると・・・。
それに、自分では来訪者のパスワードが見れてしまうので
気持ち悪いのです。。
>>95
わざわざ説明ありがとうございますた。
今試してみたのですが、記事削除時の比較がなかなか上手く
できないです。もう少し頑張ってみます。ペコリ
0105nobodyさん
02/10/17 23:44ID:???吊るされに逝ってきます
0106nobodyさん
02/10/18 01:16ID:eCvV6YKPError 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:???0108107
02/10/18 01:50ID:???eval{ flock() };
0110nobodyさん
02/10/18 13:52ID:lRuefofgperlで作れるのは掲示板とかチャットとかです。
パスワード発行のやり方とかは知りません。
0113nobodyさん
02/10/18 17:46ID:???掲示板やchat作れるんならパスワード認証くらい簡単なはず。
一。<form action="hoge.cgi"></form>の中にメールアドレスとパスワードを入力する画面の設計。
二。hoge.cgiでメールアドレスとパスワードをファイルにかき出す。
三。メールアドレスを集めて、sendmailで用意したメール本文を送信。
ところで、パスワードは何に使うのかなぁ
0114名無しさん@カラアゲうまうま
02/10/18 19:40ID:???0115110
02/10/18 19:48ID:???メールの送る内容(情報)を選べるようにしたいので、
会員登録後もIDとパスワードでログインして送信設定などを各会員にやってもらう予定なのです。
会員システムの時、IDとパスワードをユーザーが自分で決める方式と
IDは任意でパスワードは自動発行のだいたい二通りがあると思うんですけど
これってどっちがいいんでしょうか。別にどっちも大して変わらないんでしょうか。
0116超凄腕プログラマー
02/10/18 20:22ID:???0117nobodyさん
02/10/18 22:04ID:XuCvNIceCJ-CLUB の I-BOARD2001
のアイコンの種類と文字色の種類を増やしたいんですが、
set.cgi で増やしても
500 Internal Server Error
が出てしまいます。
他に書き換えなければならない部分があるのでしょうか?
エディタは秀丸とメモ帳でやってます。
改行は自分では入れていません。
0118nobodyさん
02/10/18 22:30ID:???0120nobodyさん
02/10/18 23:08ID:???自動発行ってトリップみたいなものかな?
実状は自分で決めたパスワードさえ忘れてしまう人が呆れるほど多かったりする罠。
自動発行だと忘れる人は倍増する気もするけど、
メールでしっかり忘れないようにするなら逆に忘れられても大丈夫かもしれない。
0121nobodyさん
02/10/18 23:56ID:Ts+deQMHどんな原因が考えられるでしょうか?
まったく見当がつかなくて困っています。
おながいします。
0122nobodyさん
02/10/19 00:00ID:???・CGIが使えない設定
・Perlやシェルの場合のパス違い
・パーミションの実行権なし
・アップロード時の文字コードまたは改行の設定ミスあるいはバイナリモードでアップした
0124デフォルトの名無しさん
02/10/19 00:45ID:???0125nobodyさん
02/10/19 00:53ID:SecGkhKpどう書けばイイですか?
0126121
02/10/19 01:17ID:???べんきょうになりますた。
>>124
すっげー根詰めてやってたから、和んだ(w
メールアドレスの@が犯人でした
ありがとうございました
0127rubyist@カラアゲうまうま
02/10/19 09:13ID:???糞言語に相応しい糞なやりとりだな。
0128デフォルトの名無しさん
02/10/19 09:36ID:???あんたさあ、糞言語の糞スレなんか読んでないで、
rubyスレでまともな発言したらぁ
0129nobodyさん
02/10/19 09:51ID:???()で変数にしたい部分を囲む。
したら$1という変数に勝手に入る。
正規表現のとこに書いてあるだろ。
0130名無しさん@カラアゲうまうま
02/10/19 15:26ID:5SBDqdQD0132nobodyさん
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()
}
■ このスレッドは過去ログ倉庫に格納されています