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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0002nobodyさん04/11/27 11:35:47ID:DJwiGeFM
関連スレ
CGI: Common Gateway Interface part 11
http://pc5.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc5.2ch.net/test/read.cgi/php/1030209573/
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/
【 スクリプト改造依頼スレ 】(丸投げ) part2
http://pc5.2ch.net/test/read.cgi/php/1092304968/
△▲ WebProg 初心者の質問 Part10 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1095633323/
【Perl】ファイルロック(排他処理)について語ろう
http://pc5.2ch.net/test/read.cgi/php/1024795138/
★負荷軽減対策委員会(Perl、PHP)★
http://pc5.2ch.net/test/read.cgi/php/1034645635/
【Perl】掲示板を使ろう!
http://pc5.2ch.net/test/read.cgi/php/988890976/
Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/
CGIに依存しないPerlの話題一般/Part2
http://pc5.2ch.net/test/read.cgi/php/1030548610/
0003nobodyさん04/11/27 11:36:08ID:???
[過去ログ] 1 of 2

Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
0004nobodyさん04/11/27 11:37:01ID:???
[過去ログ] 2 of 2

Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc5.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc5.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc5.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc5.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc5.2ch.net/test/read.cgi/php/1069846177/
part31 http://pc5.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc5.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記)
part33 http://pc5.2ch.net/test/read.cgi/php/1078076768/
part34 http://pc5.2ch.net/test/read.cgi/php/1081148490/
part35 http://pc5.2ch.net/test/read.cgi/php/1085557731/
part36 http://pc5.2ch.net/test/read.cgi/php/1089779036/
part37 http://pc5.2ch.net/test/read.cgi/php/1093106507/
part38 http://pc5.2ch.net/test/read.cgi/php/1097158988/ (前スレ)
0005nobodyさん04/11/27 11:38:05ID:???
ム板Perlスレより

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[オンラインマニュアル]
Perldoc.com: http://perldoc.com
perldoc.jp: http://perldoc.jp
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
0006nobodyさん04/11/27 19:29:38ID:yZ3pGjpn
CGIでメールを取り込んで添付ファイルを指定ディレクトリに保存しています。
同じサーバーから取得しようとすると下記の情報だけしか取得できません。
今は、来たメールを別ドメインのアカウントへ転送して、
そのサーバーへ接続して取得しています。
ちなみにプロバイダの共用レンタルサーバー(FreeBSD)では
問題なく動作します。
なぜ同一サーバーから取得しようとすると
下記しか取得できないのでしょうか?


-mimemk00
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

..(本文)..
--mimemk00
Content-Type: image/gif;
name="(添付ファイル名).gif"
Content-Transfer-Encoding: base64

..(以下添付ファイル)..
0007nobodyさん04/11/27 19:45:57ID:/KXyQL2R
ネットゲーム大富豪
掲示板で参加者募ってね
ttp://www.esuna.co.jp/chocobon/
0008nobodyさん04/11/27 21:51:00ID:???
>>6
スレ違い
0009nobodyさん04/11/27 22:20:57ID:???
掲示板に検索機能を付けようと思うのですが、単純に正規表現でm/keyword/とやっても
関係ない文字に一致してしまいます(keywordがアルファベット一文字の時とか)。
これらを回避するにはどうすればよいのでしょうか?
sjisでやってます。
0010nobodyさん04/11/27 22:32:48ID:???
全部URLエンコードしてしまうってのはどうだ。
0011nobodyさん04/11/27 23:57:09ID:???
perlメモの通りにやればsjisでもかなり高確率でいけますね。
すいませんですた・・・
0012nobodyさん04/11/28 01:30:44ID:UnlanLPT
@list=(f,b,a,d,c,e)
というような中身が順不同な配列があったとして、
cとeを配列から削除するにはどうすればいいのでしょうか?
0013nobodyさん04/11/28 01:32:49ID:UnlanLPT
cとeじゃ、最後だけとればいいということになるので、
順番ではなく、bやcといった、中身を見て削除する方法を教えてください。
0014nobodyさん04/11/28 01:56:38ID:QZh49BOK
>>13
perlメモ
0015nobodyさん04/11/28 02:01:19ID:???
>>12-13
削除したい要素がどれぐらいあるかにもよる。
その例の通りならこんなのでもいいし。

@list = grep(!/b|c/, @list);
0016nobodyさん04/11/28 08:04:27ID:???
>>14-15
ありがとうございます。参考にします。
0017!1304/11/28 09:52:02ID:???
>15
その別の方法とはどんなものですか?
0018nobodyさん04/11/28 11:26:37ID:???
splice()で削除するもよし。
foreachで1周させつつ必要なものだけ別配列にpushするもよし。
1周させつつshiftとpushを繰り返すのもよし。
0019nobodyさん04/11/28 14:12:35ID:???
ファイルロックの動作確認ってどうやってやるの?
0020nobodyさん04/11/28 14:43:17ID:???
同時に動作させる以外にないだろ
0021nobodyさん04/11/28 15:35:07ID:???
>>20
どうやって同時にアクセスさせるの?
0022nobodyさん04/11/28 15:59:57ID:???
>>21
>>20は同時にアクセスさせるとは書いてないだろ!

ファイルをロックした状態のままsleepさせておけば?
0023nobodyさん04/11/28 16:41:10ID:???
>>22
なるほどね。



同時にアクセスも同時に動作も同じようなもんだと思うけど。
0024nobodyさん04/11/28 16:48:00ID:???
同時に動作 -> flock部の実行が重なるように。
同時にアクセス -> スクリプトの開始(or ファイルのopen)が同時。
てな感じかねぇ。
話題がflockだからどっちでも通じると思うけど。
0025nobodyさん04/11/28 17:27:56ID:???
>>23
まぁいいじゃないか
突っ込まれてちょっとイラってきてたんだよ
0026nobodyさん04/11/28 21:07:19ID:???
>>23
コンビニで同時にレジに並んだ人が同時に店に入ったわけじゃないだろう。
0027nobodyさん04/11/29 02:47:51ID:???
シェルスクリプトのような感覚でベタ書きしてくのと、パッケージを細かく分けて
OOPっぽく書くの、どっちがパフォーマンス的に有利なんだろう。
一概には言えないだろうけど、一般論として。
0028nobodyさん04/11/29 02:50:14ID:3ENBI+n/
>>27
やっつけはベタ書き
0029nobodyさん04/11/29 02:54:21ID:???
>>27
そりゃOOPの方が不利。そのままソフトウェア設計の一般論に当てはまるかと。
(良く設計されたOOPのシステムはパフォーマンスが良いという事も)
ただしperl自体がそこそこでかいので、誤差程度でしかないと思うが。
0030nobodyさん04/11/29 03:53:29ID:???
個人的にはCGIで1000ステップ程度なら、むしろベタの方が見やすい。
特にHTML出力する部分はヒアドキュメントでずらずらと書かれてた方が
ぱっと見で解り易いしメンテも楽。
0031nobodyさん04/11/29 04:14:04ID:???
>>27
OOPはパフォーマンスを上げるためじゃなく開発性を上げるためのもの
確かに>>30のいうようにOOPにすると逆に小難しくなるのも確かだね

OOP自体は遠回りしてでも処理を分割するから
無駄に変数定義してたりするけど
よほどのことがない限り差が出たりはしないんじゃないかなぁ
0032nobodyさん04/11/29 08:55:50ID:???
よく1回しか使わない関数でもサブルーティンにする香具師いるじゃん。
あれ見やすいってことだろうけど、漏れは、ぜんぶメインで書く。
実際、ベンチやると、メインだけの方が速いんだよな。余りやったこと
ないが、別ファイルにしたモジュールのインクルードはさらに遅くなる
と思われ。
0033nobodyさん04/11/29 09:29:08ID:???
perl使う人って、一行でも無駄な処理をやるのを嫌がるもんね。
0034nobodyさん04/11/29 10:04:31ID:???
で、そういう人に限って速いアルゴリズムを使ってなかったりするんだよね。
0035nobodyさん04/11/29 11:19:34ID:vhU7fwVw
デコード部分について色々と試しているのですが
$value =~ s/[\x00-\x20]+/ /g;
の記述についてです。
これはどのような意味を持つのでしょうか?
0036nobodyさん04/11/29 11:22:53ID:???
文字コード0x00〜0x20の文字が一つ連続していたら一つのスペースに。
0037nobodyさん04/11/29 11:26:06ID:???
1つ以上連続していたら打露
0038nobodyさん04/11/29 11:30:40ID:???
一つ以上。
0039nobodyさん04/11/29 11:33:46ID:???
PerlでCGI書いて1000ステップなんてありえない。

せいぜいデカいやつで100ステップ超えるぐらいだな。
0040nobodyさん04/11/29 12:15:29ID:???
まあそれで自分が見やすいならいいけどさ。
0041nobodyさん04/11/29 13:17:08ID:???
5.000が出始めたときちょっとやったんだが、
馴染めなくて結局シェルとsedとawk一辺倒だった。
今思えばあの時ちゃんとやっとけば良かった。
0042nobodyさん04/11/29 13:28:07ID:???
同じサブルーチンを他のCGIで使う予定がある時とかだと、
その時は一回しか使わなくてもサブルーチンを作っておくことは良くある。

>>41
今からでも遅くないからがむばれ。
0043nobodyさん04/11/29 13:53:05ID:???
1. とりあえずベタでスクリプトを1本書く
2. よく似てるが少しだけ違う処理のスクリプトを何本か copy&paste で作る
3. 共通部分に仕様変更が発生する
4. copy&paste したところをスクリプトの数だけ書き直し、嫌気がさす
5. サブルーチン化する

てのが誰でも一度は通る道だと思ってたんだが、ひょっとして漏れだけ?
0044nobodyさん04/11/29 14:05:25ID:???
サブルーチン化するのがOOPってわけじゃないし
OOPの書き方も人それぞれだから結局見にくいことに変わりはないケースもある
そもそも再利用するための書き方だからね
0045nobodyさん04/11/29 14:10:56ID:???
>>43
結構な確率で通るんじゃないかな
俺も昔は良くやってたし
0046nobodyさん04/11/29 14:45:43ID:???
仕事でperlを使う場合、負荷や処理効率の悪さはあまり気にせずに済む場合が多い。
しかしレンタルの共用サーバとなると結構気になる。
実際、仕事より趣味のWebプログラミングの方がシビアだったりする。
0047nobodyさん04/11/29 14:53:51ID:???
言語によって人格変わる人いない?俺がそうなんだが。
javaはモデリング命だし、Cの場合は当然モジュール化しっかりやる。
でもperlだと・・・。
0048nobodyさん04/11/29 21:07:05ID:???
言語によって変わるなんて、プログラマ向いてないよ。
0049nobodyさん04/11/29 21:07:26ID:???
>>47
人格まではどうかはわからないけど、その言語の慣習に従う傾向はあると思う。
言語自身がそういった特定の用途向けに設計されてたりする事もあるから、言語毎に切替えるのが適切な対応なんじゃないかな.
細かいところでは、コーディングスタイルや変数/関数の命名規則なんかでも、その言語の標準に合わせたりするよ。

>>32
コストの判断を誤ってるような気がする。

関数呼出のオーバーヘッドの為、関数定義して使う方が遅いのは当然だけど。
ベンチ取ったとしても数千回回して1秒に届くかどうかの誤差の範囲内では?
ループ内で何度も呼ばれる関数ならインラインで展開する価値はあるかもしれない、
でも、一度しかつかわれないのなら、コードのみやすさとか保守性の方を優先させるべきだと思う。

0050nobodyさん04/11/30 01:16:47ID:???
確かに人格まではいかないけど
言語によって変えるのは普通じゃないかな

逆に無理やり同じように書く方がプログラマに向いてない
0051nobodyさん04/11/30 11:00:35ID:???
perlでコードもヒアドキュメントのHTMLもきっちり色分けして表示してくれる
エディタないですかね?
perlでコーディングする時、みんなどんなエディタ使ってるんだろ。
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使うとヘッダ、フッタ、フォーム、メッセージ表示部分、って感じに
分けることはできないから、同じようなテンプレートをいくつか用意する事になるし。
■ このスレッドは過去ログ倉庫に格納されています