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

Perlコーディング初心者質問スレ Part 49

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/05/31(水) 04:32:28ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0458nobodyさん2006/06/12(月) 01:29:00ID:???
>>455
もう一つだけならpiyoかmogeか、かな。しかしあわせて検索すると恐ろしく件数が減る罠

>>456
RFC3092読んどけw
0459nobodyさん2006/06/12(月) 01:33:49ID:???
$a、$bを使うことで何か弊害が?
っていうやりとりに繋がっちゃうか恐れてたけど無駄に終わってよかったですw
0460nobodyさん2006/06/12(月) 02:08:47ID:???
>>459
>>450
0461nobodyさん2006/06/12(月) 03:44:18ID:???
>>457
そうか、piyo か。

メタ構文変数 http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E6%A7%8B%E6%96%87%E5%A4%89%E6%95%B0 とか言うんだなw

hoge fuga piyo で、hogehoge fugafuga piyopiyo とか重なってくのが通例みたいね。
hogera とか mogeta とか使ってみたす。
0462nobodyさん2006/06/12(月) 03:49:56ID:???
>>433
お前ちょっと、CODE COMPLETE読め。
0463nobodyさん2006/06/12(月) 03:51:21ID:???
>>457
line か length だろね。
length とか割とよく使うのに長いんだもんな。
0464nobodyさん2006/06/12(月) 17:44:14ID:m4uvfRE1
質問です。

配列@sclArrayには
@sclArray = (●●大学,△△大学,●●大学,□□大学,●●大学,XX高校・・・);
というような形で200種、1,000件くらいの学校名が入っています。

これを

%schHash = (
●●大学=>'15',
△△大学=>'8',
□□大学=>'7',
XX高校=>'14',
・・・
);

という形にしたいのですが、根本的にやりかたがわかりません。
調べ方が悪いのかgoogle様にお伺い立てても出てきません・・・

よろしくお願い致します。
0465nobodyさんNGNG
もうちょっと何がしたいのか具体的に
0466nobodyさん2006/06/12(月) 17:55:56ID:???
>>464
その数字の意味はエスパーを御所望か
$schHash{$_}++ foreach @sclArray;
0467nobodyさん2006/06/12(月) 18:11:03ID:???
googleにも聞きようが無いじゃん。
自分で考えろってこった。
どうも考える事を放棄して、ぐぐってる人が多いよね。
04682782006/06/12(月) 19:04:02ID:???
すみませんソートについてもう一度お教えください

前回、配列にするということでご指導頂き、ソートはできました
それでなんですが、実はもう一個keyがあって揃えたいのです
最初は日付でソートし、同じくキャラクターのものを並びにし、

20060612 a
20060520 a
20060610 b
20060423 c という感じにしたいのです
二回繰り返すと最初のソートがリセットされてしまいます
何か方法はあるのでしょうか?

foreach(@data){
push @{$list{$1}},$_ if/^<>inf<>--.*<>(\d*)<>----/ ;}
foreach $key (sort keys %list){
push @htm, @{$list{$key}};
}

foreach(@htm){
push @{$list2{$1}},$_ if/^<>inf<>--(.*).*<>----/ ;}
foreach $key (sort keys %list2){
push @htm2, @{$list2{$key}};
}
0469nobodyさん2006/06/13(火) 00:52:20ID:???
>>464
大学ごとに固有の識別番号が決まっているのでしょうか?
それとも入試合格ラインの偏差値のようなデータ?
大学名と番号の対応が、名称から番号を導けるような規則性を持っていないのなら、
元となるデータなしに自動的に番号の入ったハッシュを作るのは不可能なんじゃないですか。
その対応はExcelの表かコンマ区切りテキストか何かの形で手元にあるのですか?
04704572006/06/13(火) 01:17:24ID:???
>>463
なるほど。コード読むとき少し楽になりそうです。アリトゥース!!

>>464の数字は配列内での同じ学校名の登場回数と推測。
けどおれのスキルでパッと思いつくのはパターンマッチごにょごにょ・・・
ハッシュのキーごとにインクリメントごにょごにょ・・・が精一杯orz
↑まったく当たっていないかも
0471nobodyさん2006/06/13(火) 05:43:37ID:???
>>468
同時に比較すればいいんでね?

my @arr = qw(
    foo-1 bar-2 baz-3 qux-4
    quux-1 corge-2 grault-3 garply-4
    waldo-1 fred-2 plugh-3 xyzzy-4 thud-5
);
my @new_arr =
    map { $_->[0] .'-'. $_->[1] }
        sort { ($a->[1] == $b->[1]) ? $a->[0] cmp $b->[0] : $a->[1] <=> $b->[1] }
            map { my ($k, $i) = split (/-/); [$k, $i] } @arr;
$, = "\n";
print @new_arr;
exit;

誰かもっといい方法あったらおせーて orz
0472nobodyさん2006/06/13(火) 06:10:34ID:???
>>468
とりあえずこれ。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_do_i_sort_an_array_by__anything_

ググればもっといいドキュメントが出てくる。
0473nobodyさん2006/06/13(火) 08:04:09ID:???
>>470
後者で行うのが一般的

>>471
<=>とcmpは両辺同じだったら0を返すからorや||で繋ぐだけでいい
04744682006/06/13(火) 12:07:21ID:???
有り難うございます
これは難しい・・・
04754682006/06/13(火) 12:34:52ID:???
まずこれから教えてください
1行のラインが
<>a<>b<>c<>d<>e
という風に、要素が<>で区切られ、それが格納された@dataがあるとします
この中の2つの要素でソートしたいのです、要素には同じ値もあります

2つのkeyをどういう風に考えハッシュを作ったらいいのでしょう?

大変初歩的で申し訳ありませんが、リンク先をプリントしていくら
読んでも簡単に理解できません。
0476nobodyさん2006/06/13(火) 12:55:07ID:???
>>475
無理を承知でお願いします。
どうかうちのバカ息子に因数分解を教えてやってくれませんか?
何度教科書を読んでも理解できないって言うんです。
そのくせ、友達が「こうじゃない?」って親切にヒント出してくれてるのに
無視したりするような非常識な子で…でも、根は優しい良いコなんです。

ちなみに、息子は足し算と引き算はできるらしいんですが
掛け算と割り算はよく分かってないようです。
だから、まず掛け算から教えて欲しいそうです。
おそらく相当な時間が掛かると思いますが、
どうかタダで息子が納得できるまでお付き合い下さいますようお願い申し上げます。
0477nobodyさん2006/06/13(火) 13:15:40ID:???
>475
> リンク先をプリントしていくら
> 読んでも簡単に理解できません。
理解できるまで何百回でも読んでください。
0478nobodyさん2006/06/13(火) 13:21:15ID:???
なんでハッシュとかいう言葉が出てきたのかわからねえw
結果としては >>471 で既にできてるじゃんな。それすら理解してないのかね?
04794682006/06/13(火) 14:10:46ID:???
すみません、他の作業しながらしばらく自習してきます
04804642006/06/13(火) 18:12:16ID:???
「(何種類でてくるかわからない)大学名と、
その大学名の出現回数をハッシュにしたい」でした。
質問が悪くてごめんね。

>>466であっさりできました。
ありがとう。
0481nobodyさん2006/06/13(火) 22:03:14ID:???
>>468
少しはググった?
「perl sort 複数 項目」でぐぐれば、コピペプログラミングできる程度の情報が出てくる。
0482nobodyさん2006/06/14(水) 00:39:55ID:???
綺麗な書き方をしていて、誰にでも見やすいcgiがあったら参考にしたいのですが、無いでしょうか?
他人が見ても何をやってるか分かるプログラムを書きたいのですが、汚い書き方が身についてしまい困ってます。
簡単なBBS程度のものだと助かります。
0483nobodyさん2006/06/14(水) 01:15:45ID:???
>>482
「KENT」で検索すれば、掲示板関係を色々配布している人のサイトがあるよ^^
0484nobodyさん2006/06/14(水) 01:20:32ID:???
個人的に結城さんのコードとか読みやすくて好きだなぁ。
use strict; しつつCPANモジュールを駆使したCGI。

Tropy のソースはタイ変数が使われてて面白い。
http://www.hyuki.com/tropy/

YukiWikiMini は200行ぐらいでWiki書いてる。こちらもなかなか。
http://www.hyuki.com/yukiwiki/mini/index.html

コメントが少ないから、ちょっと難しいかも。
0485nobodyさん2006/06/14(水) 02:11:28ID:???
>>483
ちょwwwwww
0486nobodyさん2006/06/15(木) 12:01:24ID:???
[ main.cgi ]

#!/usr/bin/perl
require './lib.pl';
&test;


[ lib.pl ]

sub test{
print "Content-type: text/html\n\n";
print "test";
}

↑500エラーになる。

[ main.cgi ]

#!/usr/bin/perl

sub test{
print "Content-type: text/html\n\n";
print "test";
}

&test;

↑エラーにならない

requireで読み込むと必ずエラーになってしまうのですが、どうしてでしょうか?
0487nobodyさん2006/06/15(木) 12:08:41ID:???
requreは真の値を返さないとダメでした…。

1;か。
0488sage2006/06/15(木) 21:58:51ID:gFTNSvnG
最近Perlはじめたのですが、
Perlで

print $cgi -> header(-charset=>"EUC-JP");

と記述したのですが、作ってブラウザーでみると
文字化けしてます。。。
ブラウザーの「表示」→「エンコード」を見ると
西ヨーロッパ言語が設定されてます。。。
これをEUC−JPに直すと文字化けしないのですが、
どうやれば、最初から文字化けしないようにできるのでしょうか?
0489nobodyさん2006/06/15(木) 22:14:33ID:???
>>488
多分、HTMLの出力もCGIモジュールを使ってると思うんだけど、出てきたHTML見て見れ。
start_htmlのほうで何も指定しないとlang=en-USのcharset=iso-8859-1になる。

ということで
start_html(-encoding => "EUC-JP", lang => "ja")
0490nobodyさん2006/06/15(木) 22:18:23ID:???
未だに print "content-type: text/html;charset=euc-jp\n\n"; と書きたくなってしまう俺はオールドスタイル…
04914892006/06/15(木) 22:27:19ID:???
あ、ごめんlangのほうに-が抜けた。-langに脳内置換頼む。

ところでふと気づいたけれど、CGIモジュールって
Content-Typeのmetaタグよりtitleのほうが先に来ちゃうのね。
エンコーディングの指定を一番最初に書くことが推奨されてたと思ったけれど・・・
0492nobodyさん2006/06/15(木) 22:27:38ID:???
>490
別にそれでいいじゃん
それぐらい手前で出力しろとか思うわけよ
0493nobodyさん2006/06/15(木) 23:08:38ID:???
>>489-491
なんか文字化けしたままなんですが。。。
レスついたことに(^人^)感謝♪
いわれた辺りをいじってみます。
ありがとうございました。
-------
print $cgi -> header(-cahrset=>"EUC-JP");
print $cgi -> start_html(-title=>$title,
-BGCOLOR => $bg,
-TEXT => $fg,
-encoding => "EUC-JP",
-lang => "ja",
);

-----------
といいつつ
ソース載せてみた。。。orz
0494nobodyさん2006/06/15(木) 23:28:00ID:???
>>493
-cahrsetになってる…
0495nobodyさん2006/06/16(金) 00:24:31ID:???
cgi以下のディレクトリのファイルの存在を参照したい時どうしたらいいのでしょうか?

$check = 'デイレクトリ名/ファイル名';
if (-e $check){
&sonzai
}

上記のようにしてやってみましたがどうもifをスルーしてelseのルーチンばかり実行してしまいます。
0496nobodyさん2006/06/16(金) 01:15:09ID:???
CGIはどこのディレクトリで動いてんだ
0497nobodyさん2006/06/16(金) 01:15:42ID:???
>>496
>cgi以下のディレクトリのファイル
と書いてあります
0498nobodyさん2006/06/16(金) 05:13:12ID:???
スクリプトの動いてるディレクトリと調べたいファイルのディレクトリを考えましょう
0499nobodyさん2006/06/16(金) 08:01:47ID:???
./だろ?
0500nobodyさん2006/06/16(金) 08:42:03ID:???
いや、mod_perl で動かしてるのかもわからないぞ…!
0501nobodyさんNGNG
sjisの嫌な予感が…
0502nobodyさん2006/06/16(金) 08:53:11ID:???
いや、まさかぁ
マルチバイトのファイル名をつける超絶バカは居ないでしょ…
0503nobodyさん2006/06/16(金) 09:06:03ID:???
>>502
マルチバイトのファイル名を扱う業務も普通にあるぞ。
もちろんフリーソフトを使って英数字にリネームしてから作業しても構わないわけだが、
全部Perl一本で済ませたいタイプの俺としては非常に面倒いのだ。
0504nobodyさん2006/06/16(金) 09:07:12ID:???
そろそろKENTが使ってるif{}elsif{}elseから抜け出したいと思ってるんですが、
皆さんって最初の大まかな処理分岐ってどうやってますか?

今、テストで1関数で1ファイルで作って
eval{
  require '$in{exec};'.'.pl';
  &$in{exec};
}
の様に呼ぼうかと思ってるのですが(エラー処理とかばっさり切って略記しました)、
この考え方よらもスマートなやり方があったら教えて頂ければ幸いです
0505nobodyさん2006/06/16(金) 09:23:19ID:???
if 文使うと低レベル みたいな言い方なのはなんなんだw
0506nobodyさん2006/06/16(金) 09:31:11ID:???
大まかならif elsif elseだな。
まぁperlsynでも読めみたいな。
0507nobodyさん2006/06/16(金) 10:11:47ID:???
>>505
KENTが使ってるから低レベルにみえるんジャマイカ?
0508nobodyさん2006/06/16(金) 10:18:29ID:???
アッー!!
0509nobodyさん2006/06/16(金) 10:20:03ID:???
「if」も悪くないでしょ、処理速度が遅いわけじゃない
長くなってもわかりやすければそれに越したことはないし、
作成したスクリプトを他人が触る可能性があれば
その方が管理委託しやすいしね
0510nobodyさん2006/06/16(金) 10:25:22ID:???
>>507
まあKENTがアレなのは認めるし笑えるんだが、
if 文や local 自体は全然悪くないぞ >>504
うちには関数 (サブルーチンのことだと解釈したが) ひとつひとつを1ファイルにするとかのが面倒でありえないw
0511nobodyさん2006/06/16(金) 10:34:11ID:???
eval使うくらいならelsif
0512nobodyさん2006/06/16(金) 12:51:25ID:???
僕は建都とか救援とか改造しやすくて好きですけどね
サブルーチンを使い回しまくっていると、結局条件分岐
を入れ込む回数が増えて大変だから
HTMLの構文エラー等はなくして欲しいけど
0513nobodyさん2006/06/16(金) 13:21:21ID:???
救援ってどこだ?(’’
0514nobodyさん2006/06/16(金) 13:25:39ID:???
rescueでしょ
0515nobodyさん2006/06/16(金) 13:57:10ID:???
>>514
thx 見たことなかったので見てきた。

すごいなこれw
KENTは perl4 とか過去のでも動くように、とかでしょうがないのかなとも思っていたけど、
ここは1年前作った 5.6 以上推奨のでもまったく同じ書き方でしたw
まあわかりやすいっちゃわかりやすい・・・のかな。
0516nobodyさん2006/06/16(金) 14:18:31ID:???
KENTとかのは無駄にファイル分割したオブジェクトバリバリ指向のものよりも
妙にレスポンスだけは良かったりするから困るw
0517nobodyさん2006/06/16(金) 14:48:05ID:???
基本を学ぶにはいいんじゃね?
簡単なものならフルスクラッチしたほうが早い場合もあるし。
0518nobodyさん2006/06/16(金) 15:16:01ID:???
性器表現を使って、空白文字のトリミングを行いたいんですが

$timp =~ m/^\s*(.*)\s*$/g;
$timp = $1;

というふうにやると $timp が空になってしまいます。
どうしたらよいでしょうか。
0519nobodyさんNGNG
アッー
0520nobodyさん2006/06/16(金) 15:22:19ID:???
$timp =~ s/^\s*(.*?)\s*$/$1/mg;
0521nobodyさん2006/06/16(金) 16:17:30ID:???
>>520
ありがとう。これかっこいいです。
0522nobodyさん2006/06/16(金) 16:29:57ID:???
標準出力と標準でない出力を等価に扱いたいんですが

今は 出力する前に
if( $flag==1 ){ open(NKFOUT, "| nkf"); }
とやっておいて、出力時に
if( $flag==1 ){ print NKFOUT "ちんこ"; }
else { print "ちんこ"; }
とやろうと思うのですが、ちょっと
0523nobodyさん2006/06/16(金) 16:34:42ID:???
性器表現を使って、空白文字のトリミングを行いたいんですが

$timp =~ m/^\s*(.*)\s*$/g;
$timp = $1;

というふうにやると $timpo が空になってしまいます。
どうしたらよいでしょうか。
0524nobodyさんNGNG
チンポが定義されてないからじゃー!!
0525nobodyさん2006/06/16(金) 16:37:56ID:???
ネタにマジレス乙。











正直嬉しかったぞw
0526ヽ(´ー`)ノ ◆.ogCuANUcE 2006/06/16(金) 16:46:15ID:???
>>522
if ($flag == 1) {
open(my $orig_stdout, '>&STDOUT');
open(STDOUT, '|nkf');
}

# パイプを通して出力
print "ちんこ";

# そのまま出力
print $orig_stdout "ちんこ";

perlfaq5 にある How do I dup() a filehandle in Perl? か、
perlfunc -f open を読むと良い。
0527nobodyさん2006/06/16(金) 16:59:43ID:???
>>526
ありがとう。それを参考に
if( $flag==1 ){ open(STDOUT, "| nkf"); }
とやったらだいたいうまくイキました。
0528nobodyさん2006/06/16(金) 17:31:55ID:???
<input type="text" name="F" value="&">
で送ったFと
<input type="text" name="F" value="">
に & を入れて送ったF
って違いますよね?
0529nobodyさん2006/06/16(金) 17:33:13ID:???
ああ、失礼。
&→&amp;
0530nobodyさん2006/06/16(金) 17:36:21ID:???
同意を求めないでください!><;;

HTMLなら表示されてる通り送られると思う普通。
0531nobodyさん2006/06/16(金) 17:45:41ID:???
普通のブラウザならURL中の&amp;は自動的に&に置換するから一緒じゃないか?

試せばすぐ分かることに対してまじめに答える気にはならん
0532nobodyさん2006/06/16(金) 17:46:42ID:???
#!/usr/local/bin/perl

use strict;
print "Content-type: text/html\n\n";
my $buffer;
read(\*STDIN, $buffer, $ENV{'CONTENT_LENGTH'},0);

print <<END;
$buffer
<form method="post">
<input type="text" name="111" value="&"><br>
<input type="text" name="222" value=""><br>
<input type="submit">
</form>
END
exit;

下のフォームに&amp;と入れて送信するとあら不思議。
同じような挙動をする文字を知りたいんですがどこかにドキュメントありませんか?
0533nobodyさん2006/06/16(金) 17:49:12ID:???
×<input type="text" name="111" value="&"><br>
○<input type="text" name="111" value="&&"><br>
0534nobodyさん2006/06/16(金) 17:49:56ID:???
ご、ごめんなさい><
◎<input type="text" name="111" value="&amp;"><br>
0535nobodyさんNGNG
ヒント:文字参照
0536nobodyさん2006/06/16(金) 18:16:46ID:???
スレ違い…と言おうと思ったけれど、深読みしてPerlコーディングの話と考えてみる。
$hogeにはブラウザから送られてきたのをデコードしただけの物が入っていて、
print <<END;
<form method="post">
<input type="text" name="hoge" value="$hoge"><br>
<input type="submit">
</form>
こんなことをやって、&が入っていたら&に変わっちゃう…とかいう理由での質問なんじゃないか。
HTMLに流し込む前に実体文字参照に変換汁。
$hoge =~ s/&/&amp;/g;
$hoge =~ s/</&lt;/g;
$hoge =~ s/>/&gt;/g;
$hoge =~ s/"/&quot;/g;
# というかこれを知らないなら、頼むから公開するCGIなんか作らないでくれよ…
# XSS脆弱、下手するとScript Insertion脆弱だから…
0537nobodyさん2006/06/16(金) 18:40:41ID:???
>>535
ありがとうございます!!
マークアップ記号、Laten-1、ラテン拡張とアクセント記号までは
&があっても直接変換されるようですね。

>>536
そうです、受け取り側での処理に影響するのか?という部分です。
ただし変換自体が問題ではなく、2回以上変換する場合が気になったんです。
というのもHTML::FillInFormの中で変換されてるっぽくて
先に変換かませるとひどいことに・・・
いろいろ試しているうちに上記の実態参照も考慮するべきか悩んだ次第であります。
05385362006/06/16(金) 19:30:41ID:???
>>537
スマソ、ちょっとレベルを低く見すぎた。しかしそういうことは初めに(ry
混乱してるだけだと思うが、そう悩むことではないと思うぞ。

まずCGI側がFormに流し込む、生のテキスト「&amp;」を持っているとする。
HTML::FillInFormは生のテキストをHTMLに変換する。「value="&amp;amp;"」
で、ブラウザはHTMLを解釈して元のテキストに戻してからフォームを表示する。[&amp;]
Submitされると"生のテキストを"URLエンコードなり何なりしてCGIに送り返す。「hoge=%26amp%3B」
で、CGIはURLエンコードのデコード処理をして、生のテキスト「&amp;」を受け取ることになるわけだ。

なぜに二回以上変換するようなことになるのかな…
0539nobodyさん2006/06/16(金) 19:51:08ID:???
>>538
非常に混乱しております・・・
2回以上の変換なんですが、実はTTのPluginでFillInFormを使ってるんです。
他で変換しないと生のデータとFillInFormで変換されたデータが混在してしまって。
TTのタグでひとつひとつFILTERつければ回避できそうではありますが
できれば一元管理したいなあと・・・。
クエリを受け取った段階で変換してみたらFillInFormで不具合。
TTに渡す時点で変換すれば良さそうですが、データ構造が結構深いんです・・・
0540nobodyさん2006/06/16(金) 23:41:05ID:???
>>516
perlはオブジェクト指向の書き方すると遅くなるのは当然。
「ハードの性能がどんどん上がってるからかまわない」なんて言い訳してるが、
簡単なスクリプトの時にperlでオブジェクト指向の書き方するのはやめたほうがいい。
みんなKENTをけなすが、実はKENTはそれほど悪くないのかもしれない。

こういうと、きっと「コードの再利用が...」「保守のしやすさが....」って言い始めるヤツが必ず出てくる。
でもあの程度の規模だと、動作速度以外にも、理解しやすさとか、動作に必要な条件を考えると
必ずしも悪いと言い切ることは難しいんじゃなかろうか?
0541nobodyさん2006/06/17(土) 00:24:46ID:???
> 理解しやすさとか、
どうやったらあんなコードになるのか理解できない。
0542nobodyさん2006/06/17(土) 00:25:29ID:???
このジョークのことかーっ
ttp://www.lri.fr/~filliatr/evolution

ごめんなさい。言ってみたかっただけです。
0543nobodyさん2006/06/17(土) 00:28:14ID:???
>>540
> perlはオブジェクト指向の書き方すると遅くなるのは当然。

デマですね。
0544nobodyさん2006/06/17(土) 00:29:58ID:???
デマであるというソースが欲しい
0545nobodyさん2006/06/17(土) 00:30:49ID:???
そもそも

> perlはオブジェクト指向の書き方すると遅くなるのは当然。

というソースが欲しい。
0546not 5402006/06/17(土) 01:52:07ID:???
ダミアン・コンウェイ著オブジェクト指向Perlマスターコースのはじめにかな?
んー、でも、それほど問題になる部分じゃないと思う。
0547nobodyさん2006/06/17(土) 01:55:18ID:???
>>545
残念ながら、実行速度に関してだけは >>540 が正しい。

ダミアン・コンウェイの「オブジェクト指向Perlマスターコース」の「はじめに」のvii ページ
「オブジェクト経由でメソッドを呼び出す処理は、通常のPerlサブルーチンを呼び出す場合より著しく低速である」
(「著しく低速」の部分は太字で強調)

手軽に確認するなら
perldoc perltoot
if you wanted fast, you wouldn't be using objects at all

ベンチマークだったら
http://psst.jp/syn/archives/000190.html

オブジェクト指向は遅いというのは共通認識だと思っていたのだが。

だがオブジェクト指向は実行速度を上回るメリットがある。
0548nobodyさん2006/06/17(土) 02:06:34ID:???
自クラス AUTOLOAD
親クラスのサブルーチン
親クラスのAUTOLOAD
UNIVERSAL のクラスのサブルーチン
と探すんだから多少は遅くなるのは仕方がない
0549nobodyさん2006/06/17(土) 02:07:45ID:???
>>547
オブジェクト指向型プログラミングがバカみたいに遅いのは
インタプリタ言語特有の問題だな

コンパイルすれば、かなりその差はちぢまる
0550nobodyさん2006/06/17(土) 02:31:10ID:???
>>549
でも結局は遅いんでしょ?
0551nobodyさん2006/06/17(土) 02:34:36ID:???
>>547
メリットって何?
改造したり再利用しないし。
速いならそれでいいじゃん。
0552nobodyさん2006/06/17(土) 02:52:44ID:???
>>551
お前はしないのかもしれないが、他の人間はするんだよ。
第一、スクラッチから書く人間の労力だって圧倒的に違う。
0553nobodyさん2006/06/17(土) 03:20:47ID:???
>>550
うまく作れば 気のせい 程度にはなる
0554nobodyさん2006/06/17(土) 04:45:08ID:???
>>540
そそw
いきなりメソッド呼んで、このメソッドはどのファイルにあるのかな?
これかな?誤爆。。なんて事をするくらいなら、1枚板のKENTの方が
改造なんかも手早くやりやすい。
しかもダメと叩かれる部分を修正してやると、さらに体感速度が上がるのも
教材に適してるような…w
0555nobodyさん2006/06/17(土) 05:44:41ID:4rge2G1J
しかしそれで複数メンバーでの開発には適さない。
どこになにがあるのかを説明するより、モジュールリストを共有するほうが効率がいい。
今はひとりでやってるからいいかもしれないがちょっとは先を見ることを勧める。
体感なんてそんな変わらんから、規模の大きい開発の手間のほうが重要。
0556nobodyさん2006/06/17(土) 05:45:31ID:4rge2G1J
ごめんねパパ酔ってるからごめんね
0557nobodyさん2006/06/17(土) 06:31:48ID:???
>>547 のURLのベンチは面白かった。



まあ、なんていうか、
それ以外に、

オブジェクト指向では、use とか require したときの速度が遅いのが結構ネックでな。
mod_perl はその時間が減るからいいんだけど。



関数呼び出しが 1.5倍遅い、とか言っても、
それ自体は 1秒間に 45万回 か 64万回 かって違いで、ほとんど気のせい程度の時間でしょ。
問題は何回も実行する、例えば値を取得する param() 呼び出しとかなんだろうね。
それでも param() 程度なら 1000回実行して 0.01 秒か 0.002 秒の違いなんだけど。

つまり、OOPが悪いっていうけど、require とかの時間を考えなければ、そーそー体感で変わるもんじゃないと思う。
実際は他のトコで無駄省いたりして速くするようにすれば、そっちのが変わりそうだよね。
■ このスレッドは過去ログ倉庫に格納されています