自作CGIを評価するスレ
自分の作ったCGIをみんなに評価してもらうスレだよ。言語は問わないよ。 よほどプログラムが短くないかぎりはアプロダにでもアップしてね。 基本的にエラーメッセージって書かないなぁ(ぉ 規定外の値だとデフォルト値になるようにしてるなぁ 人によってコーディングの仕方が かなり違うことがわかったんで 今日は寝るサラバ 起きたら局所変数を意識したプログラムを書いてみよう。 ちょっと修正しました。批判していただいた部分は まだすべて修正できていませんが、一応アド載せときます。 BBS: http://hex51.darktech.org/cgi-bin/the/bbs.pl SRC: http://hex51.darktech.org/the.txt 余談ですが、部屋がめちゃめちゃ寒いです.. my $mini_cgi = './mini.pl'; my $cntfile = './count.dat'; my $log_dir = './logs'; our $lock_name = 'lock'; <中略> my $t_h_width = 0; my $t_f_width = 70; my $name_size = $name_max - 4; my $title_size = $text_cols; この部分って全部グローバルだからourになっちゃうよん my $hoge #グローバルと同意で無意味 { my $hoge; #○ { my $hoge; #○ } } みたいにブラケットで括られた中(サブルーチンでもなんでもいいけど・・・)で宣言した部分じゃないと無意味 はい、実は上のほうですでに言われました。 さっさとourにしておきます。 my でスコープはファイル・パッケージ内に限定されるんだから意味はあると思うよ。 our にはならない。 別のパッケージから読みこんだりしてるのでなければ、 わざわざ our にする方が意味ないと思うけど? ┌┬┬┬┐ ―――┴┴┴┴┴―――――、 . . /  ̄ ̄ ̄//. ̄ ̄| || ̄ ̄ ̄||| ̄ || __________ ./ ∧// ∧ ∧| || ||| || / [/____(゚_//[ ].゚Д゚,,) ||___||| || < こんなのが有りますた . ||_. * _|_| ̄ ̄ ∪|.|. |ヽ.__|| \__________ . lO|o―o|O゜.|二二 |.| 救済病院 || .| ∈口∋ ̄_l__l⌒l_|___|_l⌒l._||  ̄ ̄`ー' ̄ `ー' `ー' `ー' http://saitama.gasuki.com/koumuin/ ∋8ノノハ.∩ 川o・-・)ノ <先生!こんなのがありました! __/ / / \(_ノ ̄ ̄ ̄\ ||ヽ|| ̄ ̄ ̄ ̄|| ...|| ̄ ̄ ̄ ̄|| http://saitama.gasuki.com/shinagawa/ [index.cgi:26:warn] Use of uninitialized value in concatenation (.) or string at /www/oasis/html/index.cgi line 26. [index.cgi:26:warn] Use of uninitialized value in concatenation (.) or string at /www/oasis/html/index.cgi line 26. ってでてるよ>116 書き方まずかったかな? >>71 はブロックの外で宣言すると、例えばサブルーチンの中からでも参照できてしまうので 変数宣言する時は、スコープを絞って適切なブロック内で宣言しよう…と言っているのだと思う。 修正というか、むしろ改悪されえてるような・・・。 our にしてしまうと、他のファイルからも値を参照出来る様になってしまうので、 # つっこみたかったのは、 # > この部分って全部グローバルだからourになっちゃうよん # my で宣言してるのに勝手に our にはならないよー。ってこと。 よくある方法だと、main関数(サブルーチン)を作るか、 単にブロックで囲む。(ラベルは別にいらないけど便宜上) MAIN:{ my $foo = 'bar'; ; } ちなみに、定数宣言なら変数にはせずに、 use constant LOG_DIR => './logs'; という風にしておくと、代入できないから グローバルとか関係なく中の値は保証されるよ。 >>118 >変数宣言する時は、スコープを絞って適切なブロック内で宣言しよう…と言っているのだと思う。 そいう意味.、言い方まずかったですな・・・ {}って while{} foreach{} for{} sub{} {} が?有効なの if{}はどうなるの? >>121 基本的に {}で囲ってる部分は全部スコープになりますよん if{}でも eval{}でも 一緒 ファイルの重複を避ける処理 { my %count; @array = grep(!$count{$_}++, @array); } これみたいに、スコープを作るために括る事もありますし 別に全部$hogehogeみたいなやつでいいじゃん なんで局所変数とかみんなつかうの???? >>124 見通しが悪くなるから。 誤動作の元にもなりかねんし >>125 でも配ってるやつってほとんどグローバル変数のみじゃん >>126 だから自分で組んでるんだが? グローバルがいいっていうなら、そうすればいいのじゃない? 自分だけでやっとればいいってのなら一向にかまわないけど、 複数の人がからんでくるとなるとそうもいかない 取り合えず少し直してみました。 今日はPHPで学校の掲示板を作るので あまり変更はないかもしれません。 >>71 さん 気をつけないと if ($hoge eq 'hoge') { my $foo = 'hoge!'; } print $foo; この場合マズイですよね? チョットmyについていろいろと試してみます。 >>128 それはスコープの外に print $fooがあるので動作しない if ($hoge eq 'hoge') { my $foo = 'hoge!'; print $foo; } コレが正解 >>129 さん OKっす。 要はCのautoですよね? myを使わなきゃダメって訳じゃない。 使った方が良いってだけで。 グローバルである必要がないならレキシカルを使うほうが 安全だし速度的にも有利だからね。 ありじゃないの? じゃなきゃそんなモジュール作らんよ。 すみませんがちょっと漏れのスクリプトを見てください。 ソートの練習なんです。 いちおう漏れの思っている動作しているのですが,突っ込むところがあれば,後学のために色々教えてください。 ソースはこちら, ttp://members.tripod.co.jp/angeldayan/ 使ったデータはこちら ttp://members.tripod.co.jp/angeldayan/data.txt 要 cgi-lib.pl です。 たいしたものじゃなくてごめんなさい。 初心者なんで,これでも1週間かかっちゃったんです。 よろしくお願いします。 >>137 myとかの使い方覚えたほうがいいかも まだはじめたばかりなのならPHPもいいかもよ でスクリプトに関しては ファイルをアップロードするわけでもないんだし 自前でデコードしよう。 my, our でも変数のスコープは同じなんだけどなぁ。 varsプラグマ(v5.6以降だと our)を使うのは、 use strict 'vars'プラグマを有効にした時に、 複数のパッケージである変数を別のパッケージから使いたい場合、等。 no strict は、場合によっては反則 ... そういえば、さっきmyとmyなしでベンチマークを行ったら myの方が3,4倍遅かったのだけど…。メモリ消費は解らない。 自分の趣味でリファレンスを使ってソースを書いてみた・・・ cgi-lib使ったことないからあてずっぽうだけど、かなりソース書きなおす事になったねぇ ttp://iwh15.hp.infoseek.co.jp/p/e/r/perldev/cgi-bin/upload/source/041.txt >>143 8-9行目 if ($in{'rev'}){ my $script = 'http://' . $ENV{'SERVER_NAME'} . $ENV{'SCRIPT_NAME'}; ココ逆だな・・・ my $script = 'http://' . $ENV{'SERVER_NAME'} . $ENV{'SCRIPT_NAME'}; if ($in{'rev'}){ >>138 > myとかの使い方覚えたほうがいいかも わかりました。勉強します。 > PHPもいいかもよ perlと心中しまつ。 > ファイルをアップロードするわけでもないんだし いやいや、今後画像をあぷすて貼り付けるつもりなので。。。 いつになるかわかりませんが。。。。。 >>144 うわぁ、ソースが綺麗でつ。 でも、動きません。。。。。 ローカルでは「ページを表示できません」で動きませんし、 サーバにあげてみた所、最初の画面は表示するものの、 情報のリンクのところが http:// サーバー名/$script?action=1&rev=1&n=0 って、$script そのままでつ。 結果は404でつ。 自分でも調べてみまつ。 >>145 動かしてないからねぇ(w 穴ありまくりであろうかと > そういえば、さっきmyとmyなしでベンチマークを行ったら > myの方が3,4倍遅かったのだけど…。メモリ消費は解らない。 根拠を示さずに結果だけ取り出して言われても…。誤解されないかな? my の何のベンチマークを行なったの? ループ・ブロック内で変数を宣言して、そのオーバーヘッドを測っていた なんて事はないよね?それとも、ホントに変数の参照・代入が3〜4倍もかかったりした? >>142 myのほうが遅いというのはちょっと信じがたいな。 ブロック外から参照される必要がないからシンボルテーブルにも 登録されないし、むしろ速くなるはずだが・・・ >>146 $html =<<'EOT'; を $html =<<"EOT"; でOKでした。 なお、ローカルで動かない件は、cgi-lib.pl へのパスが違っていたというアフォが原因。 >>149 シングルクオートよくやっちゃうんですよ〜(w 動いてよかったです cgi-bin.pl って 確か、CGI.pmがサポートしてたはず・・・ 標準モジュールだよ。 use CGI qw(:cgi-bin); ベンチマーク取って見たけど…明らかに my を使った方が高速。 -w と use strict 外して my も何も付けない場合とか、 our も試して見たけど。速度的には my < our < local って順番だったよ。 #! perl -w use strict; use Benchmark qw(:all); my $count = 100; my $code1="my \$code=1;"; map{$code1 .= "\$code++;\n"}(1..$count); my $code2="local \$code=1;"; map {$code2 .= "\$code++;\n"}(1..$count); timethese(1000,{ 'Lexical' => sub {eval $code1}, 'Dinamic' => sub {eval $code2} }); ---- Benchmark: timing 1000 iterations of Dinamic, Lexical... Dinamic: 11 wallclock secs (10.60 usr + 0.00 sys = 10.60 CPU) @ 94.34/s (n=1000) Lexical: 2 wallclock secs ( 2.14 usr + 0.00 sys = 2.14 CPU) @ 467.29/s (n=1000) >>153 追試。 --- bench --- use strict; use Benchmark; my $loop = 5000; my $code1 = 'my $code = 1;' . '$code++;' x 100; my $code2 = 'local $code = 1;' . '$code++;' x 100; timethese($loop, { '1_my' => sub { eval $code1 }, '2_local' => sub { eval $code2 } }); --- ● ActivePerl Build 522 on Win98SE Benchmark: timing 5000 iterations of 1_my, 2_local... 1_my: 4 wallclock secs ( 4.45 usr + 0.00 sys = 4.45 CPU) Global symbol "$code" requires explicit package name at (eval 5005) line 1. 2_local: 8 wallclock secs ( 7.75 usr + 0.00 sys = 7.75 CPU) ● Perl 5.005_03 on FreeBSD 4.8R Benchmark: timing 10000 iterations of 1_my, 2_local... 1_my: 6 wallclock secs ( 5.62 usr + 0.01 sys = 5.62 CPU) Global symbol "$code" requires explicit package name at (eval 10005) line 1. 2_local: 11 wallclock secs (10.92 usr + 0.02 sys = 10.94 CPU) ● Perl 5.8.0 on FreeBSD 4.8R Benchmark: timing 10000 iterations of 1_my, 2_local... 1_my: 4 wallclock secs ( 4.74 usr + 0.00 sys = 4.74 CPU) @ 2108.73/s (n=10000) 2_local: 18 wallclock secs (17.20 usr + 0.00 sys = 17.20 CPU) @ 581.55/s (n=10000) >>121 if ( ( my $aho = $query->param('hogehoge') ) eq 'hoge') { $a =~ s/a/b/; $nazoflag .= $a; } else { # $ahoは見える。 } # $ahoは見えない。 while ( defined ( my $line = <IN> ) ) { # $lineは見える } continue { # 見える } # 見えない こういう場合のスコープについては、その制御構文の最後までに限定される。←あいまいだな… 2行目が間違ってた。$aだとuse strictでエラーにならないから$ahoにしたんだけど、 これは、、sort用にこっそり、エラーにしないようになってるのかな。 追加、これはなかなか使える foreach my $hoge (@list) { } ”次のループに移る前に実行されるブロック”であってる? こんな制御構文あったんだ。知らなかった。Thx >> 158 うん。これは、nextとかを使うとき、行番号が確実に進むようにする、みたいに使う 再び。。。 すみませんがちょっと漏れのスクリプトを見てください。 前回のソートの練習に加え、ページの分割もしてみますた。 いちおう漏れの思っている動作しているのですが,突っ込むところがあれば,後学のために色々教えてください。 なお、前回指摘された “myとかの使い方” は。。。。。(^^A ソースはこちら, ttp://members.tripod.co.jp/angeldayan/test.txt 使ったデータはこちら ttp://members.tripod.co.jp/angeldayan/data.txt 要 cgi-lib.pl です。 たいしたものじゃなくてごめんなさい。 >>163 登録データの件数が増えるのならば sortの cmp と <=>のルーチンを考えたほうがいいかも foreach(@keys){ if($_->[$n] !~ /^\d*$/){ $num_flug =1; last; } } データ量増えていくと、cmpを使う場合処理が遅くなる。 if($n= 4){ if($rev){ @keys = @keys[ sort {$keys[$b]->[$n] <=> $keys[$a]->[$n]} 0 .. $#keys ]; }else{ @keys = @keys[ sort {$keys[$a]->[$n] <=> $keys[$b]->[$n]} 0 .. $#keys ]; } }else{ if($rev){ @keys = @keys[ sort {$keys[$b]->[$n] cmp $keys[$a]->[$n]} 0 .. $#keys ]; }else{ @keys = @keys[ sort {$keys[$a]->[$n] cmp $keys[$b]->[$n]} 0 .. $#keys ]; } } みたいな感じかになろうか・・・ >>164 if($n= 3){ だな、このデータの場合 >>164-168 さんくすでつ! > データ量増えていくと、cmpを使う場合処理が遅くなる。 初耳でつ メモメモ 〆(・_・。) >>168 全面的に書き換えてくださり、ありがとうございまつ! 感謝でつ! 乙でつ! さっそくテストしてみまつた! おー、動いているー。。 あれ(?_?) データ件数は88くらいあるはずなのに、80までしか表示されない。。。 でもがんばってスクリプト読み下して自分で修正したいと重い松。 >>169 初耳じゃなくて、そういうソースを組んでたから 指摘したまでなんだけど・・・ ソースちゃんと理解出来てますか??(o_ _)o >>170 > ソースちゃんと理解出来てますか 自分の>>163 のソースは理解してまつ。 >>168 さまのは、現在格闘中でつ。 苦戦しておりまつ。 >>171 では、 foreach(@keys){ if($_->[$n] !~ /^\d*$/){ $num_flug =1; last; } } lココの部分がどういう処理をしてたか説明してみそ foreach(@keys){ # @keysをforeachして if($_->[$n] !~ /^\d*$/){ # $_の$n番目の値が数字ではなかったら、 $num_flug =1; # $num_flugに1を入れまつ last; # foreachのループ抜けまつ } # ifを閉じまつ } # foreachを閉じまつ これでいいでつか? sortの cmp と <=> のどちらでやるかのフラグを立てているところっていったほうが良かったんでつか? >>168 修正できましたぁ〜! $lastpage++ unless @Record % $Pageview; を $lastpage++ if @Record % $Pageview; 俺敵には >>169 >> データ量増えていくと、cmpを使う場合処理が遅くなる。 >初耳でつ メモメモ 〆(・_・。) から、どうして >>170 >初耳じゃなくて、そういうソースを組んでたから >指摘したまでなんだけど・・・ のようなレスが付くのか良く分かりません。 cmp使うのが初耳だったんでしょ?なんで「初耳じゃなくて」なんだろう? ×cmp使うのが初耳だったんでしょ? ○cmp使うと遅くなるっていうのが初耳だったんでしょ? >>173 つまり、該当データが文字列ばっかりだとループ終わるまで抜けない。 -> 次の処理にいくまで時間がかかるという事で cmp処理のときに時間がかかるという理屈。 >>176 そのソース私の奴改造してるから聞いてみたのだけど変ですか? ところで、ソース組んだんだけどどっかアップしやすい所無いかのぉ >>178 あっ! そういう意味だったんでつね。。。. (^^ゞ んじゃ、メモを。。。消し消し. _□(. .。 んで、件のソースの改造 ttp://kiteline.net/imgbbs/img/137.txt この規模だと分ける意味がないとおもうんだけど・・・ >>178 ああ、そういう意味か。てっきりcmpと<=>の違いを言ってるのかと思った。スマソ >>181 改造さんくすでつ! でも、穴が多いッスね。 次のページを押し続けれないし、 前のページが表示されないし、 順番が0-9の固定だし。。。 勉強のため漏れが修正したいと重い松が。。。 >>181 さんの目から見て、>>168 さんのソートは処理が重そうでつか? >>168 さんのソースは今まで漏れが出会ったことのない書き方だからちょっと苦戦しておりまつ。 おっと、>>168 さんのソース、逆順ソートが出来ない。。。 あう〜 こちらも漏れが修正したいと重い松。 >>168 逆順ソートが出来ない件、修正しましたが。。。 $TableHeader .= qq|\t<th><a href="| . make_url(n => $_, action => 1) . qq|">$field{$_}</a></th>\n| for sort { $a <=> $b } keys %field; を if ($Param{'rev'}){ $TableHeader .= qq|\t<th><a href="| . make_url(n => $_, action => 1,rev => 0) . qq|">$field{$_}</a></th>\n| for sort { $a <=> $b } keys %field; }else{ $TableHeader .= qq|\t<th><a href="| . make_url(n => $_, action => 1,rev => 1) . qq|">$field{$_}</a></th>\n| for sort { $a <=> $b } keys %field; } っていうのにしましたが、もっと簡単になりまつか? >>183 別にいい悪いはないと思いますけどね。 どんな記述も出来るのがperlですし・・・ 自分が見やすければいいんじゃないでしょうか? あと、自分的には不要な変数を極力使わないぐらいですか・・・ >>184 なんだこりゃ? $TableHeader .= qq|\t<th><a href="| . make_url(n => $_, action => 1,rev => ($Param{'rev'} ? 0 : 1)) . qq|">$field{$_}</a></th>\n| for sort { $a <=> $b } keys %field; だろ? >>186 サンクス! こういう書き方は初めてなんで、かなり苦戦しておりまつ。 >>183 直した。 http://boobar.hp.infoseek.co.jp/refactoring/test.0.0.2.txt 文法的に分からんトコは、駱駝本なり perldoc なり見てね。 「何でこういう処理が必要なのか分からない」ってトコは聞いて。 >>190 う〜、感涙! 実際、かなり省略した書き方なので、文法的にわかんないところばっかりでつ。 だからどんな処理をしているのかわかんなかったりして…(^^; でも、がんばって自分で読み下して理解しまつ。 コメント文の多さに助かってまつ。 これからもご指導ご鞭撻のほどよろしくおながいしまつ。 >>188 あいた〜 苦情でつ! このスレででつまつ使ってるのって漏れだけでつ〜 こういうの使ってみたい年頃なんでつ〜 (゙ `-´)/ ヤメレ! って言う声が多ければ考えまつ。 >>190 漏れの思っている動作は、 各Info ボタンを押すと昇順にも降順にもなる。 この際順番(ここではOrder)昇順なら小さい方から1、降順なら大きい方から1がいいんでつ。 でも>>190 様、直さないでくださいね。 漏れがやるんでつ。 あと。。。 my @Field = qw(Info1 Info2 Info3 Info4); っていう所。 my @Field = qw{Info1 Info2 Info3 Info4}; my @Field = qw|Info1 Info2 Info3 Info4|; my @Field = qw(Info1 Info2 Info3 Info4(; my @Field = qw)Info1 Info2 Info3 Info4); my @Field = qw(Info1 Info2 Info3 Info4); my @Field = qw\Info1 Info2 Info3 Info4\; なんでもいいんでつね。 勉強になりまつた。 でも、 my @Field = qw(Info1 Info2 Info3 Info4); で良くて、 my @Field = qw)Info1 Info2 Info3 Info4(; でダメなのは納得いかなかったりして。。。(汗) こんなの作ったけど どうよ? http://ebrain21.com/ ~game/me/mai.cgi >>195 Internal Server Error が出たぞ マリモーマ、、リア厨かと思ってたらもっと年取ってた。爆 若いのは年齢だけだよ もう体がたがた そろそろプログラムも できなくなるかも? もーちょっとデザインなんとかならんのかね・・・ 掲示板、見にく(ry read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる