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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/11/27 11:35:03ID:DJwiGeFM
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0052nobodyさん04/11/30 11:03:00ID:???
>>51
http://pc5.2ch.net/test/read.cgi/php/1014357485/l50
0053nobodyさん04/11/30 11:10:45ID:???
eclipseのperlプラグインだとかなりカラフルに色分けしてくれるが、
まあ精度はそれなり程度。
ちなみに俺は秀丸かvimでゴリゴリ書いてる。
0054nobodyさん04/11/30 17:32:30ID:???
SJISの場合、全角ハイフン「ー」が正規表現のマッチ対象にあるとエスケープしないといけないですが、
他にそういう文字ありますか?
0055nobodyさん04/11/30 19:53:20ID:???
>>54
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0056nobodyさん04/12/01 01:41:08ID:???
それ全角ハイフンじゃないじゃん
音引き記号だぞ
0057nobodyさん04/12/01 06:24:34ID:???
>>54
2バイト目が\x40,\x5b,\x5c,\x5d,\x5e,\x7cの文字全部。
0058nobodyさん04/12/01 07:54:01ID:???
困るのは、マッチしないだけじゃなく、それらの記号が意味があるので異常終了しちゃうこと。
0059nobodyさん04/12/01 15:56:42ID:???
雑談っぽくて申し訳ないんだけど。

普段は仕事でシステム設計するしプログラミングもやる。
でも、いざWebをやろうとしたらHTMLよくわからない、CGIもよくわからない、perlもよくわからない。
CやjavaやVBならどんと来いなのに、業務アプリならおまかせ!なのに、なんか情けない・・・

そんな経験ないですか?
0060nobodyさん04/12/01 16:00:30ID:???
クマの私にはよく分かりませんが
そういう時は勉強するんじゃないんですか?
0061nobodyさん04/12/01 16:01:35ID:???
わからないのなら勉強すればいいじゃない、としか言い様がない。
0062nobodyさん04/12/01 16:12:14ID:???
あるけど、ウェブだってお金取る仕事になってる訳だし
知らなくても恥ずかしくない。必要なら勉強するかって感じだな。
「お前SEなんでしょ?ちょっとCGIってやつHPに置きたいんだけど協力して。」
って言われて「あ、そういえば良くわかんねーや」ってのがキッカケだった。
0063nobodyさん04/12/01 16:24:25ID:???
掲示板のスクリプトが2000行越えちゃったんですが、ファイル分割した方がいいですかね?
ヒアドキュメントのHTMLがどんどん長くなっていっちゃって・・・
0064nobodyさん04/12/01 16:32:42ID:???
>>63
自分の、あるいはそのスクリプトをメンテする人の技量ならびに忍耐力と相談して決めろ。

俺ならヒアドキュメント全廃して HTML::Template 使うが。
0065nobodyさん04/12/01 16:57:25ID:???
>>64
HTML::Template使う場合って、テンプレートを別ファイルにするか、
ソース内に組み込んでおくか、どちらがいいでしょうね?
余計なファイルアクセスは避けたいところ。
いずれにしてもHTML::Template使った事無いので、いったん今の状態で設置して、
テンプレート化も同時に進めてみます。
0066nobodyさん04/12/01 17:22:27ID:???
>>63
俺の作ったのなんか7486行あるぞ。
実行ステップ数は計ってないからわからんが。
その内、ヒアドキュメントは・・・どんくらいだろ。
別に長くてもいいんじゃね?
ヘタにいじくりまわして可読性が悪くなっても意味ねーし。
あと、実装してる機能にもよるだろ。
0067nobodyさん04/12/01 17:25:59ID:???
>>65
俺の環境で10000行ぐらいのやつでベンチマークとってみたら、
ヒアドキュメントにするよりも別ファイルにした方が20倍ぐらい速かった。
perl が立ち上がってスクリプトをコンパイルするときに
ヒアドキュメントの中まで構文解析するので、それに大きな時間を食われるのだと思う。

ただし環境によって違ってくる話だと思う。
コンパイル速度はCPU依存で、ディスクアクセス性能はHDD依存なので、
CPUが圧倒的に速くてHDDが無闇に遅いマシンだと、また違った結果が出るかもしれない。
0068nobodyさん04/12/01 17:34:38ID:???
>ヒアドキュメントにするよりも別ファイルにした方が20倍ぐらい速かった。
うお、マジかよ。いくら環境次第とはいえ、そこまで変わるってのもすげーな。
0069nobodyさん04/12/01 17:41:19ID:???
何種類もの画面が埋め込まれていて使うのは一つ、なんて
場合だと、外部ファイルに分離した方が使うもの1つだけ
読めばよいのでお得てなこともあるかもしれんな。
0070nobodyさん04/12/01 18:32:57ID:???
テンプレートライブラリを使うと、大抵はキャッシュやプリコンパイル機能がサポートされてるので、
オプションを適切に設定すれば、普通に埋め込むより速くても不思議じゃないよ、
HTML::Templateでも、ファイルからの読み込みは初回のみで、共有メモリにキャッシュを置く事とか出来る。
原理的にはメモリにキャッシュするのが最速なはずだし。

メモリと引き替えに実行速度重視とする場合は、
スワップとか発生すると逆にパフォーマンス低下するので、
コンテンツの規模、アクセス/更新の頻度、実行環境等を考慮して
パフォーマンスチューニングされてるのが前提だけど。

逆に言うと、こういった条件を無視して、
埋め込むほうがいいか、別ファイルに分ける方がいいかというのは、一概に判断出来ない。
条件次第では速くも遅くもなるのだから。


>>67
それくらいの規模になると、使われない処理のコードも毎回読み込まれてたりしないかな。
mod_perlだとまた結果がかわってきそう。
0071nobodyさん04/12/01 19:47:44ID:ZtAPmMKL
【質問】Perlでカウンタを作っているのですが、画像が表示されません。
     解決方法を教えてください。
     どのスレで聞けばいいのか分からなかったので、スレ違いなら誘導をお願いします。

【症状】HTMLに埋め込むタイプの画像カウンタなのですが、カウンタが表示されるはずの場所に何も表示されません。
     カウンタのCGIをアドレスバーに直接打ち込んだら、それは正しく表示されました。

     CGI側の出力

        Content-type:text/html\n\n
        <HTML>
        <IMG SRC="数値画像"><IMG SRC="数値画像">・・・(中略)
        </HTML>

     HTMLファイル側の記述は以下の二つを試しました。

        1:<!-- #exec cgi="./count.cgi" -->
        2:<!-- #include virtual="./count.cgi" -->

【環境】Apache 1.3.29(ローカルサーバー)
     「 Includes 」 「 ExecCGI 」 設定済。
     「 AddType text/html .html
       AddType server-parsed .html 」 設定済。
0072nobodyさん04/12/01 20:00:32ID:???
>>70
>HTML::Templateでも、ファイルからの読み込みは初回のみで、共有メモリにキャッシュを置く事とか出来る。
マジ?
mod_perlでなくてもOK?
レン鯖だとどうなんろう。
0073nobodyさん04/12/01 20:02:18ID:???
>>71
1:<!-- #exec cgi="count.cgi" -->
2:<!-- #include virtual="count.cgi" -->
これでどうだ?
0074nobodyさん04/12/01 20:05:08ID:???
>>72事故レス
IPC::SharedCache無いとダメか・・・。流石にうちのレンタルサーバにはインストールされてなかった。
00757104/12/01 20:13:12ID:ZtAPmMKL
>>73
すいません、結果は変わりませんでした。
0076nobodyさん04/12/01 20:39:49ID:???
>>71
<!--#include virtual="count.cgi" -->

<!-- と # の間を詰める。のがポイント。
というか、Perlの問題じゃないじゃん。
0077nobodyさん04/12/01 21:12:33ID:???
>>74
すでにperldoc読まれたかと思うけど、
一応捕捉しておくと、mod_perlじゃなくてもOk, ただし、shared_cacheオプションを使う場合はIPCが必要.

共有サーバーだとしたら、資源の独占は返ってサーバー全体のパフォーマンスを落しかねないので。
もし使えたとしても、file_cacheに留めておくのが無難だと思う。
00787104/12/01 21:26:05ID:???
>>76
ありがとうございます。
できました!
0079nobodyさん04/12/01 23:30:32ID:???
スレ違いの話題いいかげんにしろや
0080nobodyさん04/12/02 01:00:15ID:???
すれ違いじゃないと思う
0081nobodyさん 04/12/02 05:32:13ID:???
一番多いので1万2千行逝ってる。
0082nobodyさん04/12/02 12:10:08ID:WEQP3q+X
例えば
●先頭から16個目のデータをキーにしてソートする場合
@address = sort{(split(/,/,$a))[15] <=> (split(/,/,$b))[15]} @address;
●先頭から16個目のデータを1次キー、3つ目のデータを2次キーとしてソートする場合
@address = sort{(split(/,/,$a))[15] <=> (split(/,/,$b))[15] or (split(/,/,$a))[2] <=> (split(/,/,$b))[2]} @address;

ここで、ソート部をサブルーチン化しろとの上司の命令。以下のように書いてみました。
#&datasort(データの型,並べ順,並べ替え時のキー,配列)
#データの型:数値は1、文字列は2
#並べ順:昇順は1、降順は2
#並べ替え時のキー:先頭は0、3番目なら2、5番目なら4という具合。
@address = &datasort(1,1,15,@address);

#並べ替え部のルーチン
sub datasort{
 #$format:数値は1、文字列は2 $order:昇順は1、降順は2 $key:ソート対象のキー、先頭は0、5番目なら4など。
 my ($format,$order,$key,@data) = @_;
 if($format == 1){
  if($order == 1){@data = sort{(split(/,/,$a))[$key] <=> (split(/,/,$b))[$key]} @data;}
  elsif($order == 2){@data = sort{(split(/,/,$b))[$key] <=> (split(/,/,$a))[$key]} @data;}
 }elsif($format == 2){
  if($order == 1){@data = sort{(split(/,/,$a))[$key] cmp (split(/,/,$b))[$key]} @data;}
  elsif($order == 2){@data = sort{(split(/,/,$b))[$key] cmp (split(/,/,$a))[$key]} @data;}
 }
 return @data;
}
で、複数のキーを使ってソートする場合の呼び出し方がわかりません。
@address = &datasort(1,1,15,@address) or &datasort(1,1,2,@address);
だと、当然のことながらorより後ろは動かない。
誰か教えてくださいませ。。
それか、サブルーチンの書き方がおかしい?
0083nobodyさん04/12/02 13:59:06ID:???
>>82
試しに書いてみた。
sub csvsort {
  my $arrayref = shift;
  my @cmps;
  while (my($n,$cmp) = splice(@_,0,2)) {
    ++$n;
    $cmp =~ s/(\$[ab])/$1\->[$n]/g;
    push @cmps, "($cmp)";
  }
  my $fcmp = eval("sub {" . join("||", @cmps) . "}");
  map $_->[0], sort { &$fcmp } map [$_, split /,/], @$arrayref;
}

# @csvを「要素2を文字列昇順、要素0を数値降順」のオーダーでソート
@sorted = csvsort(\@csv, 2=>'$a cmp $b', 0=>'$b <=> $a');
0084nobodyさん04/12/02 14:04:30ID:???
>>82
とりあえずreturn @data
0085nobodyさん04/12/02 15:06:46ID:???
こんにちは。質問させていただきます。
会員制のサイトを作る場合、
ユーザー個々のデータを保存するのは、
CSV形式、それともユーザーごとにファイルを作成してハッシュ配列で保存、
どちらが妥当でしょうか?
例えばハッシュのイメージとしては、

Id        1
Pass    1234
Name    A男
Age        42
Job        会社員

というように考えています。
CSVだと、

1, 1234, A男, 男, 42, 会社員
2, 5678, B子, 女, 30, 営業
・
・
・
(以下リストが続く)

↑こういう形式で良いのでしょうか・・・。
よろしくお願いします。
0086nobodyさん04/12/02 15:12:42ID:???
すいません、質問です。
CGIが動いているサーバーの種類がWin系かその他系かを判定する方法ってありますか?
ファイル名を指定してファイル出力を行なうCGIがあるのですが、
Win系ですと大文字小文字関係なく既に存在するものと同名のファイルは作成できませんが、
Linuxとかですと、大文字小文字が区別されるので、作成可能にしようと思っています。
0087nobodyさん04/12/02 15:43:37ID:???
>>86
サーバの返してくるhttpヘッダにあるかもしれないので取得するとか、
cgiで環境変数SERVER_SOFTWAREを調べるとかPATHから想像するとか、
systemとかopenとか使えるんだったらperlのバージョンとかを出力させてみるとか、
サポートに聞くとか
00888204/12/02 17:39:29ID:???
ありがとうございます。

>>83
動きませんでした・・・。
もう少し考えてみます。
本心では「本当にサブモジュール化しないといけないのか?」と思いつつ
上司にも逆らえず。

>>83
間違ってる?
returnを省略しても同じ結果なのはわかるのですが。

>>87
system関数が使えるなら、win系に存在しないコマンド(lsとかcatとか)を
実行させればいいと思うのですが。

system関数は中のコマンドが成功すれば0を返すので
unless(system "ls -l"){
 Unix系のサーバーでやりたいこと
}else{
 窓系のサーバーでやりたいこと
}

でできないかな。
0089nobodyさん04/12/02 18:24:52ID:???
俺のようにWindowsにGNUツールを入れてたらどうする?
それだったらOSを識別できるコマンドで一度識別してから作ったほうがいいだろー。
unameとかでもいいし。
いちいちunless云々すんのかい?
まぁあくまでsystemやらopenやら使えるなら。
00908304/12/02 18:26:51ID:???
>>88
動かないってのはエラーが出るってこと?
それとも正しくソートされないってこと?
一応、動作確認(ActivePerl5.8.4)済みなんだけど・・・
よければ動かない〜の詳細をレス頼んます。
0091nobodyさん04/12/02 20:01:22ID:???
>>86
普通に$^Oでいいんじゃない?
0092nobodyさん04/12/02 20:54:21ID:???
>>82
datasortを使う方向で考えてみました。
速度は遅いしメモリ食うしー。

sub bogosort
{
use sort stable;

my ($key, @data) = @_;
foreach(reverse(@{$key})){
my ($format, $order, $key) = @{$_};
@data = datasort($format, $order, $key, @data);
}
return @data;
}

my @new = bogosort([[1,1,0], [1,1,4]], @data);
要素0の数値昇順、要素4の数値昇順でソート。
$keyは[(1:数値/2:文字列),(1:昇順/2:降順),要素]の配列のリファレンス。
0093nobodyさん04/12/02 21:57:32ID:???
当たり前の話だけどさ、やっぱいいソースを沢山見るべきだね。
初めの頃にケン○やらレス○やらばっか参考にしてたが、
あんなソース見てたらダメだな。
0094nobodyさん04/12/02 22:01:06ID:???
どんなソース見てればいいんだ?
0095nobodyさん04/12/02 22:06:47ID:???
YukiWikiなんていいと思うぞ。Wikiってこれだけでできちゃうのかって感じ。
超人業でもなく、ダサダサでもなく、丁度いい感じのソースとおもふ。
0096nobodyさん04/12/02 22:16:47ID:???
初めの頃なんだからさ、掲示板とかで例を挙げてくれよ
いきなり Wiki 設置しようとか思わないだろう
0097nobodyさん04/12/02 22:24:41ID:???
@{[何か処理]}@←これ、どういう場面で使うんでしょう?イマイチ意味分かりません。
0098nobodyさん04/12/02 22:39:28ID:???
@{[( ´ω`) ハラヘッピ]}@
0099nobodyさん04/12/02 23:04:37ID:???
ソースを参考にできるような掲示板など存在しない


んじゃなかろうかという気がするが、もしあったら漏れにも教えて
0100nobodyさん04/12/02 23:16:40ID:???
掲示板ってキレイに作るの難しいよな。
インラインでHTMLだーっと書いて、途中から条件分岐で何か処理して、
続きのHTMLをまただーっと・・・ってなる。
0101nobodyさん04/12/02 23:25:32ID:???
ソースをぱっと見れた方がメンテしやすいからな。
HTML::template使うとヘッダ、フッタ、フォーム、メッセージ表示部分、って感じに
分けることはできないから、同じようなテンプレートをいくつか用意する事になるし。
0102nobodyさん04/12/02 23:58:35ID:???
TMPL_INCLUDE とか手はいくらでもあるように思うが > HTML::Template でテンプレート分割

それはそれとして、昔 DBI (Pgsql) + Template Toolkit で掲示板作ったが、
コードのほとんどは入力チェック・サニタイズのための if やら s/// やらの羅列で、
あまりコーディングの勉強に使って欲しくない出来に仕上がってしまった経験がある。
0103nobodyさん04/12/02 23:59:56ID:???
>>97
my @str = qw(うんこだ 素敵 ばかみたいだ 楽だ);

print <<"EOM";
ヒアドキュメントに埋め込みができるなんて、
Perlは@{[ $str[int(rand(@str))] ]}よね。
EOM
0104nobodyさん04/12/03 00:08:25ID:???
>>103
実行結果
> ヒアドキュメントに埋め込みができるなんて、
> Perlはばかみたいだよね。
...orz...
0105nobodyさん04/12/03 00:27:48ID:DFUzRW8v
質問失礼します。
perlでブログは作成できますか?
また、何処かに参考サイト、
ソースのおいてあるサイト等があったらご教授ください。
0106nobodyさん04/12/03 00:39:11ID:???
>>105
もちろん可能(ry
スレ違いってことで一つヨロシク
0107nobodyさん04/12/03 00:40:12ID:???
http://www.movabletype.jp/get-mt.html
0108nobodyさん04/12/03 00:44:17ID:???
ワロタw
0109nobodyさん04/12/03 02:26:08ID:???
レスQ元にしたBBSを一生懸命strictにしてる最中・・・
もう全く別物。作り直したほうが早かったなこれじゃ。
0110nobodyさん04/12/03 03:04:29ID:???
>>102
Class::DBIと、Data::FormValidatorあたり使えば、
コーディングなんてほとんどしないで掲示板作れるよ。
コーディングの参考にはならんけどね。。
01118204/12/03 06:16:55ID:???
>>89
それもそうだな・・・スマソ

>>90
配列が空になります。
実際はここでソートしたものをファイルに書き出す処理があるのですが、0バイト。
CobaltにPerl5.005の組み合わせです。
これがよくないのかな。
あ、エラーは出ません。

>>92
ありがとうございます。
会社でやってみます。
0112nobodyさん04/12/03 09:03:42ID:dEjygVC1
こんにちは。質問させていただきます。
会員制のサイトを作る場合、
ユーザー個々のデータを保存するのは、
CSV形式、それともユーザーごとにファイルを作成してハッシュ配列で保存、
どちらが妥当でしょうか?
例えばハッシュのイメージとしては、

Id        1
Pass    1234
Name    A男
Age        42
Job        会社員

というように考えています。
CSVだと、

1, 1234, A男, 男, 42, 会社員
2, 5678, B子, 女, 30, 営業
・
・
・
(以下リストが続く)

↑こういう形式で良いのでしょうか・・・。
よろしくお願いします。
0113nobodyさん04/12/03 09:16:50ID:???
スレタイ読めるか?
設計考えてどうすか?ってのは

△▲ WebProg 初心者の質問 Part11 ▼▽
ttp://pc5.2ch.net/test/read.cgi/php/1101635909/

こっちが妥当だと思うが。
01148204/12/03 10:50:46ID:???
>>92
ダメでした。。
use sortでInternalServerError。

サーバーアナライザーで見ると、sortと書かれたモジュールが見つからないのですが
それが原因かな・・・。
もうちっと考えて見ます。
01158204/12/03 11:23:05ID:???
追記
>>92
use sort〜の行を外すと動くのですが、

>my @new = bogosort([[1,1,0], [1,1,4]], @data);
の後ろ側、[1,1,4]が効かず、前側の[1,1,0]だけが有効になってしまいます。。

上司に「サブルーチン化せず、1行にまとめてorで繋げたほうが素直」って
言ってはいるのですが・・・
「無理です」って言ってやろうかと思う今日この頃。
ありがとうございました。
0116nobodyさん04/12/03 11:49:21ID:???
配列内の最大値が配列の何番目であるか判別するためには、どのように書くのが簡潔でしょうか?

@list = qw(3 5 8 4 2 9 6 1 7);
#この例だと9が保存されている位置の5が欲しい

foreachで回しながら比較していくしかないのでしょうか?
0117nobodyさん04/12/03 11:53:46ID:25445hqZ
>>116
ソートして先頭か末尾取り出せば?
とスレの流れを見て言ってみる
0118nobodyさん04/12/03 11:54:48ID:25445hqZ
>>116
ごめん。よく読んでなかった。orz
0119nobodyさん04/12/03 11:56:11ID:???
>>114, >>115
use sortはプラグマ、おそらく perl のバージョンが古いと使えないはず。perl5.6以降だったかな。

>>82 のコードは、条件が多くなるとsliptの回数がすごい事になりそうなので、
これをキャッシュする様な仕組みを考えるといいと思う。参考までに、CPANより
http://search.cpan.org/~jnh/Sort-Fields-0.90/Fields.pm

0120nobodyさん04/12/03 12:17:33ID:???
HTMLに記述されたリンクを踏むと、そのページに飛んだりファイルを開いたりダウンロードを行ないますが、
ファイルを開いたりせずに強制的にダウンロードダイアログを表示させる事は可能でしょうか。

例えば、<A href="hoge.txt">hoge</A>などのリンクがあって、これをIEで踏むとIEがファイルを開いてしまいます。
これをダウンロードダイアログを出したいと思っています。
現在使っているサーバー(@nifty)ではCGI設置ディレクトリにあるログファイルなどへの直接のアクセスはできないので、
CGIを通してダウンロードを行ないたいと考えています。
多分出力するContent-typeの周辺をいじればいいのではと考えているんですが、
参考になるようなサイトをご存知の方はいらっしゃらないでしょうか。
0121nobodyさん04/12/03 12:23:42ID:???
>>115
119が紹介したモジュール使った方が便利だと思うが
テキトーに書いてみた。

sub datasort {
  my($spec, @list) = @_;

  return sort {
    my $r = eval {
      my @a = split(/,/, $a);
      my @b = split(/,/, $b);

      foreach (@$spec) {
        my($format, $order, $index) = @$_;
        my $r = ($format == 1)? (@a[$index] <=> @b[$index]):
            ($format == 2)? (@a[$index] cmp @b[$index]):
            die "型が変: @$_";
        next if $r == 0;
        return ($order == 1)? $r:
            ($order == 2)? (-$r):
            die "並べ順が変: @$_";
      }
      return 0;
    };
    if ($@) { die "$@" }
    return $r;
  } @list;
}
0122nobodyさん04/12/03 12:24:07ID:???
>120
http://www.google.com/
0123nobodyさん04/12/03 12:28:49ID:???
>>120
content-typeをapplication/octet-streamにしてやればたいてい
ダウンロードにいくとは思うが、ブラウザの類の挙動の話なので
perlとは関係ないからスレ違い。
0124nobodyさん04/12/03 12:35:07ID:???
>>116
List::Utilのreduce使って

reduce { $list[$a]>$list[$b]? $a: $b } 0..$#list
0125nobodyさん04/12/03 13:54:20ID:???
フォームから0を入力してもらうとき、それを真として処理するにはどうしたらいいでしょうか?
例えば<OPTION>で、0 時として送信したときに偽として処理されてしまいます。
0126nobodyさん04/12/03 13:56:51ID:???
>125
if($input_data != ""){
}
0127nobodyさん04/12/03 13:57:35ID:???
if ($object ne ''){ 処理 }
0128nobodyさん04/12/03 13:57:48ID:???
ごめ、Perlでは違うんだった。
if($input_data ne ""){
}
012912504/12/03 14:00:11ID:???
そんな簡単なことだったんですね^^;
ありがとうございました
0130nobodyさん04/12/03 14:03:50ID:???
久しぶりにここ覘いたけど以前にも増してアレなスレになっちゃってますね
昔は参考になるスレだったのに残念です
0131nobodyさん04/12/03 14:18:51ID:???
ここが参考にならなくなったって事は>130が初心者じゃなくなったって事だろ。
めでたいことじゃないか。
0132nobodyさん04/12/03 14:26:10ID:OybfBlRl
>>82
sub datasort($$$$\@) {
my ($separator, $types, $orders, $keys, $data) = @_;
die "ERROR: datasort()の引数が間違っています。\n"
unless ($#types == $#orders and $#orders == $#keys);
my $keys_len = scalar @$keys;
my $data_len = scalar @$data;
my %data_index = map {
$_ => [(split($separator, $data->[$_]))[@$keys]]
} (0..$data_len-1);
my @sorted_index = sort {
my $ret;
for (0..$keys_len-1) {
my $n = $data_index{$a}[$_];
my $m = $data_index{$b}[$_];
my $type = $types->[$_];
my $order = $orders->[$_];
($ret = $order * ($type?($n cmp $m):($n <=> $m))) ? last : next ;
}
$ret;
} (0..$data_len-1);
return map {$data->[$_]} @sorted_index;
}
my @data = ("1,2,3,4,5", "0,0,0,0,5", "0,9,7,6,0", "1,3,5,7,9", "2,4,5,7,0");
for (datasort(qr/,/, [1,1], [-1, 1], [4,2], @data)) { print "$_\n"; }
0133nobodyさん04/12/03 14:26:46ID:???
今と昔は普及度が違う
0134nobodyさん04/12/03 14:28:39ID:???
>>131
いいこといった!
俺もここの内容が屁に見えるようになるまでがんばろう!

今は俺にとってここは宇宙です。
0135119,13204/12/03 14:31:31ID:OybfBlRl
# 行数が多くなったので、分割

132のdatasort関数の Usage:

# datasort(区切り文字, 型, 順序, キー, 配列)
#
# 区切り文字 ... splitの第一引数
# 型 ... true: cmp, false: <=>
# 順序 ... 降順 -1, 昇順 +1
# キー ... キーとなるフィールドのインデックス(0から数える)
# 配列 ... ソート対象のデータ
#

ベンチマーク取ってないけど、(テストも余りしてない)
データのsplitが(配列の数)回で済む為、少しは速くなると思う。
0136nobodyさん04/12/03 15:08:29ID:???
>>134
残念ながら屁は見えないと思う。
01378304/12/03 15:31:58ID:???
>>111
!?空になりますかそうですか。。。

>>115
>>my @new = bogosort([[1,1,0], [1,1,4]], @data);
>の後ろ側、[1,1,4]が効かず、前側の[1,1,0]だけが有効になってしまいます。。
古いPerlのsortは、比較関数が0を返した時に元の並び順が保障されないので
そのようになるです。

というわけでPerlをバージョンアップすべし。
0138nobodyさん04/12/03 15:37:24ID:???
HTML::Templateの質問なんですが。
file_cacheでキャッシュされるのは、何がキャッシュされるんでしょう?
templateの構造や内部的なtemplateの解析結果とかがキャッシュされるのだろうか?
ページそのものじゃないよね、たぶん。
0139nobodyさん04/12/03 16:13:56ID:???
man HTML::Template によれば、parsed template がキャッシュされるらしい
解析したデータ構造を Storable でシリアライズしてキャッシュしてるんだと思う
0140nobodyさん04/12/03 16:29:48ID:???
>>139
ありがとうございます。よく読んだらperldocに書いてありましたね・・・orz
これでおよそ50%パフォーマンス向上ってんだから、結構時間掛かるんですね。
01418204/12/03 17:47:58ID:???
もうだめぽ・・・自信喪失。

素直に
>●先頭から16個目のデータを1次キー、3つ目のデータを2次キーとしてソートする場合
>@address = sort{(split(/,/,$a))[15] <=> (split(/,/,$b))[15] or (split(/,/,$a))[2] <=> (split(/,/,$b))[2]} @address;
のように繋げて書く(というか人に使わせる)ようにします。。くすん。。。

また何かありましたら質問させてください。
ありがとうございました。
0142nobodyさん04/12/03 20:25:23ID:???
$a = "&gt;&gt;&gt;&gt;あいうえお。";
このような文字列があるとして、先頭から連続してる&gt;の数を数える方法ってないでしょうか?
できるだけ簡潔に書きたいのですが・・・。
0143nobodyさん04/12/03 20:51:56ID:???
>先頭から連続してる&gt;の数
その例だと4つって数え方でいいのか?
0144nobodyさん04/12/03 21:11:40ID:???
>>142
こんなんでどう?
$num = $a =~ s/(?:^|(?<=&gt;))(&gt;)/$1/g;
print $num;  # 4
0145nobodyさん04/12/03 21:12:08ID:???
($n)= $a=~ /^((?:&gt;)+)/;
$n= length($n)/4;
0146nobodyさん04/12/03 21:14:43ID:???
>>142
my $count = 0;
$count++ while($a =~ /\G&gt;/g);
014714504/12/03 21:24:55ID:???
簡潔さで負けてるので1つにまとめて
$n= length(($a=~ /^((?:&gt;)+)/)[0])/4;

>>144
それだと、 &gt;の連続が後半に再びあったときに・・・
0148nobodyさん04/12/03 21:36:09ID:???
>>143
そうです。先頭から>が幾つ連続してるか、って言い方するべきでした。
>>144-147
ありがとうございます。>>146さんのやり方だとそのまま>を任意の文字列への
置換にも使えそうですね。
0149nobodyさん04/12/03 21:40:41ID:???
ああ、\G使うって手もあったか。
0150nobodyさん04/12/03 22:22:14ID:???
&gt;にワロタ
0151nobodyさん04/12/03 23:14:28ID:???
みんな凄いね。考えてたけどサパーリだった。
■ このスレッドは過去ログ倉庫に格納されています