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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/10/17(月) 00:47:17ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0404nobodyさん2005/11/10(木) 06:43:00ID:???
>>403
>でもあの書き方ではわかんないですよ。僕だけですかね・・・

おまいだけ。あと「supecial thnx」は恥ずかしいからやめておけ。
0405nobodyさん2005/11/10(木) 09:39:09ID:???
>>403
真性ですね。
0406nobodyさん2005/11/10(木) 10:11:45ID:???
釣られるなよ
0407nobodyさん2005/11/10(木) 10:52:53ID:CqV/pVhD
perlの開発ソフトってないですか?
ビルダーとかみたいな
0408nobodyさん2005/11/10(木) 11:38:03ID:???
>>407
Perl書くのにどんなエディタ使ってる?
http://pc8.2ch.net/test/read.cgi/php/1014357485/
0409nobodyさん2005/11/10(木) 22:41:58ID:???
質問です。
現在フォームメールを作っているのですが、どうもうまくいきません。
スクリプトの流れとしては、

(サブルーチンA)フォームデータの取り込み、デコード、データをハッシュ(%FORM)に代入。
           ハッシュのデータをソートしてメールボディー用の変数($body。もちろんグローバル変数)へ代入。

(メインルーチン)送信ボタンが押されたかチェック。
           押されたら送信用のサブルーチンへ。

(サブルーチンB)確認ページの表示。ハッシュのデータをソートして表示。

なのですが、確認ページで送信ボタン(キー名はsubmit)を押すとハッシュの中身はsubmitだけになってしまうし、$bodyはどこかへ消えてしまうし、どうにもさっぱりです。
どなたか導いてください。宜しくお願いします。
0410nobodyさん2005/11/10(木) 22:44:24ID:???
とりあえずソースを全部、どこかのアップローダに上げろ
0411nobodyさん2005/11/10(木) 23:19:21ID:???
>>409
送信ボタンが押されたかのチェックなんてPerlの範疇じゃないと思うが
0412nobodyさん2005/11/10(木) 23:53:03ID:???
cgi.pm使ってdumpしてみりゃ
0413nobodyさん2005/11/11(金) 00:15:11ID:???
そもそもやりたいことがよくわからんのだが。
サブルーチンとか言ってるけど、ページの遷移はないってこと?
0414nobodyさん2005/11/11(金) 04:45:03ID:???
>>409-413
>>61
0415nobodyさん2005/11/11(金) 08:59:41ID:???
フリーのできるだけシンプルなフォームメール見て勉強するといいよ
0416nobodyさん2005/11/11(金) 18:22:32ID:???
質問です。

Perlでテキストファイルから1行ずつ読み込んで処理する時には
while(<>){}
で済みますが、
既に変数に入っているテキストを1行ずつ処理する場合、どうしたらよいのでしょうか?
0417nobodyさん2005/11/11(金) 19:03:57ID:???
改行をsplitでもすればぁ
0418nobodyさん2005/11/11(金) 19:15:49ID:???
Perl の標準で一行ずつ巡回する方法 (メソッド) って無いんだっけ?

テキストの内容がでかいとでかい配列ができちゃうのがイヤだけど、

foreach my $line (split(/^/, $txt)) {
# $line に何かする
}
0419nobodyさん2005/11/11(金) 19:18:47ID:???
>>417,418
レスありがとうございます。

>>418
すいません。splitの/^/というのは??
この場合の^は行頭を表す^ですか?
04204182005/11/11(金) 19:22:14ID:???
>>419
そうです。
0421nobodyさん2005/11/11(金) 19:26:56ID:???
>>420
それで改行で切れるんですね。知りませんでした。
ありがとうございます。
0422nobodyさん2005/11/11(金) 20:30:27ID:???
while (/^(.*)$/smg) { 処理($1) }

とかでも
04234182005/11/11(金) 20:51:55ID:???
>>422
うお、そっちの方が無駄な配列生成しない分スマートじゃんね。吊ってくるわ・・・
0424nobodyさん2005/11/11(金) 22:14:13ID:???
>>422
ありがとうございます。
だいたいどんな事をやっているのか理解するのに
しばらくかかりました。^^;

オプションを使いこなせると便利になりそうですね。
0425nobodyさん2005/11/11(金) 23:15:24ID:???
WindowsXP、Perl5.8.7でPPMからDBD-SQLiteをインストールしましたが、connectやdisconnectは出来る(ファイルも生成される)ものの、prepareやdoメソッドを呼ぶとPerlインタープリタが強制終了してしまいます。
原因は何でしょうか?
0426nobodyさん2005/11/11(金) 23:23:21ID:???
よくある
0427nobodyさん2005/11/13(日) 16:57:21ID:???
$ua->credentials($netloc, $realm, $uname, $pass):
これを使ってBasic認証通過させたいんですが
鯖側の$realmが日本語になってるせい?なのか失敗します
アドバイスお願いします。。
0428nobodyさん2005/11/13(日) 18:56:49ID:???
>>427
文字コード合わせればええやん
0429nobodyさん2005/11/13(日) 22:03:50ID:???
>>427
文字コードがわからなければLWP::UserAgentのget_basic_credentialsを再定義して
$realmになに渡ってきてるのか調べてあわせてやればいいと思うよ。
0430nobodyさん2005/11/14(月) 09:03:21ID:???
>>428-429
通過出来ました。ありがとうございました。
0431nobodyさん2005/11/14(月) 11:00:01ID:W63Ukjvm
ReadParse()を使用してフォームから取得した変数を
open関数を使用して、UTF-8でテキストファイルに出力したいのですが
その方法がよくわからず困っています。

フォームから取得した変数はSHIFT_JISなので、
そのままopen関数で出力すると、テキストファイルの文字コードは
SHIFT_JISになってしまいます。

どなたか知っておられる方がいましたら、よろしくお願いします。
0432nobodyさん2005/11/14(月) 11:25:42ID:???
>>431
UTF-8だから
Jcode.pmを使えばいいのかなーとか思ったけど
0433nobodyさん2005/11/14(月) 17:51:10ID:WMignAMj
PHPでいうところのshuffleにあたる関数ってありますか?
つまり、やりたいことは、配列をランダムに並び替えることです。
0434nobodyさん2005/11/14(月) 18:03:25ID:???
>>433
http://boobar.hp.infoseek.co.jp/bench/randlist.txt
0435nobodyさん2005/11/14(月) 18:12:42ID:???
List::Util::shuffle がいいと思う。
パフォーマンスなんて問題になってから考えれば良い。
気になるならそもそも Perl なんか使わんし。
0436nobodyさん2005/11/14(月) 18:39:21ID:3zfzQPqE
ttp://other.free-uploader.com/up/download/1131960567298904.t6lFKb
DLPass:1234

windowsでActivePerl5.8を使っています。

IO::Socketを使い、コンソールでのチャットを作ろうと思っています。
現在は、サーバー側はechoserverのプログラムを、
クライアント側にはプロセスを受信・送信に分けたものを使おうと思っています。

実行すると文字は入力できるのですが、うまくserver側にデータが行かないようです。
たぶん原因はclient側なんですが・・。

煮詰まってしまいました。。ヒントお願いします(つд⊂)
0437nobodyさん2005/11/14(月) 19:04:07ID:???
>>436
■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/
04384362005/11/14(月) 21:57:56ID:3zfzQPqE
ActivePerlでIO::Socketやプロセスについて勉強するには
どんな本やwebページがオススメですか?
0439nobodyさん2005/11/14(月) 22:07:01ID:???
>>438
とりあえずIO::Socketでググれ
0440nobodyさん2005/11/14(月) 22:09:16ID:???
perldoc
0441nobodyさん2005/11/14(月) 22:12:01ID:???
>>438
>>7-8
04424362005/11/14(月) 22:23:16ID:3zfzQPqE
もしかしてTCP/IPつかったconsoleチャットって難しい?^^;

ラクダもドキュメントも読んだけどよくわかんね^^;

神はー神はいないのかー>w<;
0443nobodyさん2005/11/14(月) 22:33:57ID:???
とんでもねぇ、あたしゃ神様だよ
04444362005/11/14(月) 22:59:47ID:3zfzQPqE
神様がだめなら妖精さんでもいいから降臨たのむ・・・
0445nobodyさん2005/11/14(月) 23:09:56ID:???
>>442
ラクダもドキュメントも読んだのに分からないのなら、Socket や
ターミナルを扱う為の基本的な知識が君には欠けている。
そしてその解説はこのスレの範疇ではない。
04464362005/11/14(月) 23:20:04ID:3zfzQPqE
初心者質問という言葉に甘えすぎました。
出直してきます。
0447nobodyさん2005/11/15(火) 00:24:28ID:???
つか何がわかんねーのかわからん状態の奴に何を答えりゃいいんだ
0448nobodyさん2005/11/15(火) 13:35:44ID:???
お前を、殺す!
0449nobodyさん2005/11/15(火) 14:05:37ID:???
通報、しますた!
0450nobodyさん2005/11/15(火) 15:28:57ID:???
ソケットを使うならこの辺りかしらん。

Programming UNIX Socket FAQ in Japanese
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/

どちらもCを読めること。
0451nobodyさん2005/11/15(火) 18:19:07ID:5cRd32ic
WEBページのアクセス数が多くなってきたため、ロードバランサを用いて負荷を分散しようと思います。

現行
インターネット--------WEBサーバ(DBなど含む)

現行↑の単純な構成を
↓の構成(WEBサーバ3台、DBサーバとにしたいのですが、

イメージ
                       WEBサーバ1
インターネット--------ロードバランサ----WEBサーバ2--------Perlプログラム&DBサーバ
                       WEBサーバ3


この時にPerlのプログラム等に関して注意事項、不具合予測等はありますか?
0452nobodyさん2005/11/15(火) 18:20:22ID:???
>>451
Perlが関わる部分なんて無いよ
大丈夫かおいw
0453nobodyさん2005/11/15(火) 18:20:45ID:5cRd32ic
WEBページのアクセス数が多くなってきたため、ロードバランサを用いて負荷を分散しようと思います。

現行
インターネット--------WEBサーバ(DBなど含む)

現行↑の単純な構成をロードバランサーを加えて
↓の構成(WEBサーバ3台、Perlプログラム&DBサーバ)にしたいのですが、

イメージ
                          WEBサーバ1
インターネット--------ロードバランサ----WEBサーバ2--------Perlプログラム&DBサーバ
                          WEBサーバ3
0454nobodyさん2005/11/15(火) 18:25:47ID:???
>>451>>453
板違い。使ってるOSがなにか知らんがUNIX板かLinux板逝け
04554532005/11/15(火) 18:26:44ID:???
失礼つかまった。
退散します
0456nobodyさん2005/11/16(水) 00:22:50ID:F5yPWKpZ
ひろゆきさん、おめっとー
0457nobodyさんNGNG
手軽にワイルドカードDNSにしとけ
0458nobodyさん2005/11/16(水) 01:49:10ID:???
すみません、誘導されて来ました。

画像掲示板をCGI-Perlで作ったんですが、
アドレス先に画像が存在しているかどうかを判別する事は可能でしょうか?
0459nobodyさん2005/11/16(水) 02:07:22ID:???
>>458
アドレス先って何のこと?
ローカル? リモート?
0460nobodyさん2005/11/16(水) 02:26:25ID:???
ローカルだったら訊いてこねえだろw
0461nobodyさん2005/11/16(水) 03:50:28ID:???
いや、わからんぞw
0462nobodyさん2005/11/16(水) 11:27:12ID:???
>458
マルチすんな
0463nobodyさん2005/11/16(水) 13:37:18ID:???
>>462
誘導されて来た、ってんだからマルチじゃないんじゃないの?そゆことじゃなくて?

>>458
リモートのサーバにある画像なら、HTTP でアクセスして存在確認する必要があるかと。
LWP とか使って HTTP で HEAD とか GET することになると思うけど、
具体的なやり方はまずぐぐって調べてみれ。
04646592005/11/16(水) 19:05:42ID:nAWFz8ua
DBI::Pgを使用してPostgreSQL7.3を使用しています。
ページャー機能(ページ送り)を加えたいんどえすが、
DBI::Pagerがレンタルサーバに入っていないため、
簡単は方法はないかと探してます。何か方法はありませんか?
pure perlなモジュールがあれば一番良いのですが。

0465nobodyさん2005/11/17(木) 14:07:26ID:AgumOSx0
簡単なデータベースのようなCGIを作ろうとしています。
更新記録CGIと検索CGIを別々に見つけてそれを合わせて実現させようとしています。

この中で「○円以内のもの」を抽出するというのをしたいんです。
ドロップダウンリストに
〜100円
101円〜200円
201円〜300円
〜〜
1,000円〜
という設定をしておいて、リストからその価格帯だけを表示させるという物です。

ドロップダウンリストに
<option value="1">〜100円</option>
<option value="2">101円〜200円</option>
<option value="3">201円〜300円</option>
として、普通にif文で

if($FORM{'data'} eq '1'){
if($data =< 100){ ; } else { next; }
}
elseif($FORM{'data'} eq '2'){
if($data => 101 && $data =< 200 ){ ; } else { next; }
}
〜〜
とすればOKなのでしょうか?(データには桁区切りのカンマが入ると思います。)
ほかによい方法がありますか?または、参考となるCGIがあれば同時に教えてもらえるとありがたいです。
0466nobodyさん2005/11/17(木) 14:27:44ID:???
>>465
>>1
>>7-8

【CGI】こんなCGI探してますver.18
http://pc8.2ch.net/test/read.cgi/hp/1123833110/

■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/
0467nobodyさん2005/11/17(木) 14:32:54ID:AgumOSx0
>>466
回答ありがとうございます。

自分で改造を考えているので、他のCGIを利用するとかすべてを作ってもらうわけでもないのですが、
ここじゃだめなんでしょうか?
0468nobodyさん2005/11/17(木) 14:59:14ID:???
>>467
>>1 を読めと。未来の話をせず、実際に躓いてから >>7-8
調べた上で質問しろと。

> 更新記録CGIと検索CGIを別々に見つけて
については >>466

> 自分で改造を考えている
については

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/

自作の部分に関してはココ。
0469nobodyさん2005/11/17(木) 15:01:10ID:???
>>465 >>467

データを array か hash に入れておき、grep 等で取り出せば OK。

ex.

my @data = (
  { name => 'a', price => 100, },
  { name => 'b', price => 200, },
  ...
};

...

my $lower = 100;  # 実際は form から入力された値を検査し、代入。
my $upper = 200;

my @out = @data;
@out = grep { $_{price} >= $lower } @out if $lower;
@out = grep { $_{price} <= $upper } @out if $upper;

...

for (@out) {
  print "$_{name}: $_{price}\n";
}
0470nobodyさん2005/11/17(木) 16:35:00ID:???
>>469
スレ違いに構わないように。
0471nobodyさん2005/11/17(木) 17:05:22ID:vCe+doXk
NFSでは使用できないflockの代わりに、lockfという関数があるみたいだけど、
lockfって実際どれくらいの実績があるのでしょう?
バージョンはいくつから使えるのでしょうか?
0472nobodyさん2005/11/17(木) 17:37:43ID:???
>>471
lockf という組込関数は perl に存在しない。
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlfunc.pod

perl の組込関数である処の flock() は標準 C ライブラリに用意
されている flock(2) か fcntl(2) か lockf(3) で実装されていて、
これらの関数が環境によっては NFS 越しのロック処理に対応
していない。なのでどんな環境で走らせるか決め打ちできない
場合は、システムコールレベルではなくスクリプトレベルでの
排他処理機構を用意する必要がある。

http://search.cpan.org/modlist/File_Name_System_Locking
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/
0473nobodyさん2005/11/17(木) 18:11:47ID:+ypcUw74
すみません。失礼します。行き詰ったので質問させていただきます。
PHPの「setcookie($cookie,$setword,$expire);」で発行したCookieは、
CGI等で読み込めないのでしょうか?
0474nobodyさん2005/11/17(木) 18:32:19ID:???
>>473
ここは CGI スレではなく Perl のスレです。

△▲ WebProg 初心者の質問 Part12 ▼▽
http://pc8.2ch.net/test/read.cgi/php/1125215604/

CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/
0475nobodyさん2005/11/17(木) 19:10:47ID:vCe+doXk
>>472
ありがと
0476nobodyさん2005/11/17(木) 21:47:27ID:7TvwAtma
http://perl.toshinari.net/cgi/bbs/new2ch/
この2ch型掲示板に表示されるIDを環境変数REMOTE_USERに一致させたいのですが
どうしたらよいでしょうか

sub id {
my($id,$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst,$month,$date,$identify);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$identify = substr($ENV{'REMOTE_ADDR'},-2).substr(crypt($ENV{'REMOTE_ADDR'},$year-$mon*100),2);
$id = crypt($identify,$mday."L");
$id = substr($id,-10);
return $id;


$id = $ENV{'REMOTE_USER'};
if ($id eq '') { $id = ":"; }

にしてみたりしたのですがよくわかりません。。
0477nobodyさん2005/11/17(木) 21:55:58ID:???
>>476
質問がよく分からん。
また、

> にしてみたりしたのですがよくわかりません。。

の、何がよくわからんのかよく分からん。
0478nobodyさん2005/11/17(木) 22:02:17ID:???
>>476
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/
0479nobodyさん2005/11/17(木) 23:05:58ID:???
こんばんは。
携帯用のフォームを作ってるんですけど
フォームから送信したデータって
当然、携帯のメモリ内にあるわけですよね?
あるフォームから送信、その先にもフォームがあり
そこからさらに今受け取ったデータも含めて新たなデータ送信と
要はどんどん送信するデータ増えていくわけですが
こういうのは問題ないのでしょうか?
どなたか教えてください。
よろしくお願いします。
0480nobodyさん2005/11/17(木) 23:12:26ID:???
>>479
△▲ WebProg 初心者の質問 Part12 ▼▽
http://pc8.2ch.net/test/read.cgi/php/1125215604/
0481nobodyさん2005/11/17(木) 23:20:50ID:???
ありがとう。移動します。
0482nobodyさん2005/11/18(金) 03:21:21ID:???
スレ違いのカスどもが多すぎるwwwww
0483nobodyさん2005/11/18(金) 03:52:36ID:b/mBx1Hf
連想配列に

%hash = (
  'audio' => "オーディオ",
  'video' => "ビデオ",
  'cd' => "CD-ROM",
  'dvd' => "DVD",
  'bench' => "ベンチマーク",
  'text' => "テキスト",
  'bin' => "バイナリ"
);
の様に値をセットして
  while(($k, $v) = each(%hash)){ print "$k = $v\n"; }
とか
  foreach (keys(%hash)){ print "$_ = $hash{$_}\n"; }
ってやっても
  'audio', 'video', 'cd', 'dvd' => "DVD", 'bench', 'text', 'bin'
の順番 (代入した順番) で出力してくれないんですけど、代入順での出力を
希望するなら
  @list = ('audio', 'video', 'cd', 'dvd' => "DVD", 'bench', 'text', 'bin');
の様に“順番”を別で保持しておくしか無いんでしょか?

ちなみに上記のコードだと
audio
cd
bin
dvd
video
text
bench
の順番で出力されます。
0484nobodyさん2005/11/18(金) 04:13:14ID:???
>>483
そういうモジュールがある。
名前は忘れた。
0485nobodyさん2005/11/18(金) 04:13:25ID:???
>>483
標準モジュールじゃないからサーバで使えるかは疑問だけどFAQにこういうのがある
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_can_i_make_my_hash_remember_the_order_i_put_elements_into_it

これが使えないならデータ構造の工夫次第だろうな。
まあ、キーの順番を覚えておくのが一番簡単かと思う。
もしハッシュである必要性が無いなら…つまり$hash{$key}の形で使うことが無いなら、
こういう構造が考えられるね。
@list = (
['audio' => "DVD"],
['video' => "ビデオ"],
...
);

04864852005/11/18(金) 04:24:50ID:???
>>483
補足
確認してみたらTie::IxHashはPure Perlだった。
そのままディレクトリ下にTie/IxHash.pmとして配置すれば動くよ

http://search.cpan.org/~gsar/Tie-IxHash-1.21/lib/Tie/IxHash.pm
ここのSourceからダウンロードね
0487nobodyさん2005/11/18(金) 04:25:30ID:???
>>483
tie を使って自分でそういう hash を作ることも可能。
0488nobodyさん2005/11/18(金) 07:56:03ID:???
%hash = (
  'audio' => {index=>0, value=>"オーディオ",},
  'video' => {index=>1, value=>"ビデオ",},
  'cd' => {index=>2, value=>"CD-ROM",},
);

オレはこれでやってる。。
0489nobodyさん2005/11/18(金) 10:58:48ID:???
eachの戻り値をキーと値のリストで受け取ってる奴が多いが、
キーだけ受け取って値はハッシュから取った方が効率がいい。
0490nobodyさん2005/11/18(金) 11:09:40ID:???
>>489
普通に考えるとeachがせっかく返す値を捨てて値をハッシュから
とったらハッシュをひく手間がかかる分損しそうなものだが...
foreach (keys ...)でまわせって意味かな? それならわかる。

とりあえず論よりベンチ。

use Benchmark;
my %h = (1..2000);

timethese(undef, {
foreach => sub {
foreach my $k (keys %h) {
my $v = $h{$k};
}
},
each => sub {
while(my($k, $v) = each %h) {
}
},
each_key => sub {
while(my($k) = each %h) {
my $v = $h{$k};
}
},
});

Benchmark: running each, each_key, foreach for at least 3 CPU seconds...
each: 3 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 594.34/s (n=1890)
each_key: 3 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 470.68/s (n=1525)
foreach: 3 wallclock secs ( 3.21 usr + 0.00 sys = 3.21 CPU) @ 686.60/s (n=2204)
0491nobodyさん2005/11/18(金) 11:32:55ID:???
ベンチとるときは、できるだけ同じ条件でやらないと

timethese(undef, {
foreach => sub {
foreach $k (keys %h) {
$h{$k};
}},
each => sub {
while(($k, $v) = each %h) {
$v;
}},
each_key => sub {
while(($k) = each %h) {
$h{$k};
}},
undef => sub {
while(($k,undef) = each %h) {
$h{$k};
}},
});
0492nobodyさん2005/11/18(金) 12:18:06ID:???
>>490-491
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_each_HASH

my($k) = each %h も ($k) = each %h もリストコンテキスト。
my $k = each %h なり $k = each %h として計らないと意味無し。
0493nobodyさん2005/11/18(金) 12:38:34ID:???
面白い結果が出た
OS : Windows XP
Ver: Active Perl 5.8.7 build 815
CPU: Athlon 1.6GHz -> 1.0GHzにクロックダウン
Mem: 256MB

ベンチマーク部>>491のものに>>492の修正を加えて使用
my %h = (1 .. $data_count*2);

データ数 2^2
Benchmark: running each, each_key, foreach, undef for at least 3 CPU seconds...
each: 4 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 142105.46/s(n=427169)
each_key: 2 wallclock secs ( 3.11 usr + 0.02 sys = 3.13 CPU) @ 138342.29/s(n=432458)
foreach: 2 wallclock secs ( 3.17 usr + 0.00 sys = 3.17 CPU) @ 118013.55/s(n=374575)
undef: 4 wallclock secs ( 3.13 usr + 0.01 sys = 3.14 CPU) @ 124147.58/s(n=390320)

データ数 2^4
Benchmark: running each, each_key, foreach, undef for at least 3 CPU seconds...
each: 2 wallclock secs ( 3.18 usr + 0.00 sys = 3.18 CPU) @ 42106.14/s (n=133687)
each_key: 3 wallclock secs ( 3.00 usr + 0.01 sys = 3.01 CPU) @ 40220.63/s (n=120863)
foreach: 4 wallclock secs ( 3.30 usr + 0.00 sys = 3.30 CPU) @ 48033.28/s (n=158750)
undef: 3 wallclock secs ( 3.10 usr + 0.00 sys = 3.10 CPU) @ 35960.05/s (n=111620)

データがごく少ない場合においてはeachでまわしたほうが若干速い。
でも2^3個程度までの話だしkeysをforeachで回したほうが良さそうだな
0494nobodyさん2005/11/18(金) 15:29:22ID:???
うちじゃ逆だな。キー数が少ないうちはforeach+keysが速いが、
多くなるに連れて遅くなり7000個あたりでeach系に抜かれた。
list eachとscalar eachでは微妙にscalar eachのが速いが、
ループ内で値をたくさん使うならlist eachのがよさそう。
0495nobodyさん2005/11/18(金) 15:42:17ID:???
>>489-494
追試とまとめ。
http://boobar.hp.infoseek.co.jp/bench/hash.txt
04964932005/11/18(金) 16:18:46ID:???
>>494
データ数1024よりも多くして実験してなかった・・・こちらでは2050付近で抜かれた

>>495
詳しい検証乙

データ数が増えるとkeysの戻り値の配列の大きさがネックになるわけか
0497nobodyさん2005/11/18(金) 16:44:41ID:???
>>495
乙。勉強になりますた。
0498nobodyさん2005/11/18(金) 16:49:18ID:???
CGI::Liteも5.8x系の標準モジュールにしてほしいんだけど、
こういうのはどこで言えばいいんだろ(´・ω・`)
0499nobodyさん2005/11/18(金) 17:03:10ID:b/mBx1Hf
>>485
@list = (['key' => 'val'], ...);
これで値をセットしたときってどうやって取り出すんでしょうか?
for(my($i) = 0; $i < $#list; $i += 2){
  my($key, $val)= ($list[$i], $list[$i + 1]);
  〜処理〜
}
って感じですか?


>>485, 486
ちょっと使い方を覚えてみようかな


>>488
そうやって値をセットしたときの取り出しはどうやるんでしょか?

0500nobodyさん2005/11/18(金) 17:07:32ID:???
>>498
その要求が通るとは到底思えないが、弾の人にでもメールしてみたらぁ?

>>499
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html
0501nobodyさん2005/11/18(金) 17:25:13ID:b/mBx1Hf
にゃるほろ2次元配列ってゆう考え方でしたか。
慣れるまでに時間かかりそうですが、ありがとうございました m(_ _)m
0502nobodyさん2005/11/18(金) 17:35:46ID:b/mBx1Hf
教えてもらった事を比較的自分に分かり易い様にしようと弄ってたらこんな感じになりました。

@list2 = (
{'audio' => "オーディオ"},
{'video' => "ビデオ"},
{'cd' => "CD-ROM"},
{'dvd' => "DVD"},
{'bench' => "ベンチマーク"},
{'text' => "テキスト"},
{'bin' => "バイナリ"}
);

foreach (@list2){
  my($key, $val) = each(%$_);
  print "$key => $val\n";
}

順番を保持しなくちゃならないときはこんな感じでいこうかなって思います。
0503nobodyさん2005/11/18(金) 17:40:35ID:???
>>502

ちなみに
>>485 みたいに配列使うなら
foreach my $elem (@list) {
 my($key, $val) = @$elem;
}
で行ける。

>>502 のやり方だと要素が1つだけのハッシュがいくつか出来てしまうので
少しだけ空間効率が悪い。
まぁ、小さいから気にならないだろうけど。
■ このスレッドは過去ログ倉庫に格納されています