- 1 名前:nobodyさん mailto:sage [2008/08/06(水) 22:54:32 ID:???]
- Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】 質問するときは内容をよく吟味してから投稿してください。 「コマンドの意味がわかんない」とかはマニュアル見ましょう。 回答者さんは何でも屋じゃありません。 1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。 最低でも1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。 お勧めサイトは >2 以降 前スレ pc11.2ch.net/test/read.cgi/php/1203935151/ 過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
- 110 名前:nobodyさん [2008/09/02(火) 08:30:11 ID:guk/QrQq]
- そしてtest.cgiには
use CGI 'Vars'; my %in = CGI::Vars; open LOG, '+<score.dat'; my %rank = map { chomp; split /\t/, $_, 2; } <LOG>; $rank{$in{score}} = $in{name} if $rank{$in{score}} < $in{name}; my @rank = sort { $rank{$b} <=> $rank{$a} } keys %rank; truncate LOG, 0; seek LOG, 0, 0; print LOG map { "$_\t$rank{$_}\n" } @rank[0..9]; print "Content-type: text/plain\n\n"; print map { "score$_=$rank[$_]&name$_=$rank{$rank[$_]}&" } 0..9; test.cgiにはtop10の空欄表示はされますが 登録する画面にはいかずそのまま終わってしまいます score.datも空欄ですが、動いているようです
- 111 名前:nobodyさん [2008/09/02(火) 15:54:14 ID:XutqN0xS]
- 汎用のエラーサブルーチンで、
ログに場所や原因を特定できる情報を吐くために、 callerで大元の呼び出し元からのツリーを吐く方法を探してます。 力技でやれば、階層確認用の変数を作って mainから関数を呼ぶたびに1ずつインクリメントしていってエラー関数でforで 階層確認用の変数の分だけ回せば出来るとは思うんですが、 sub err { my ($sadd) = @_; my $s; for ($i=MAXVALUE; $i <= 0; $i--) { $s .= caller($i).' / '; } print STDERR $sadd."\n".$s; } 手動でインクリメントすることなく、上記のMAXVALUEを取得する方法はありませんでしょうか。
- 112 名前:nobodyさん [2008/09/02(火) 17:08:26 ID:62/De0KZ]
- 以下の場合だと、$hogeにはIPアドレスが入ってます。
$hoge=gethostbyaddr(pack('C4',split/\./,$ENV{'REMOTE_ADDR'}),2)||$ENV{'REMOTE_ADDR'}; 以下の場合だと、$hogeは空になります。 $hoge=gethostbyaddr(pack('C4',split/\./,$ENV{'REMOTE_ADDR'}),2)or$ENV{'REMOTE_ADDR'}; 後者が空になってしまうのは何故ですか?
- 113 名前:nobodyさん mailto:sage [2008/09/02(火) 17:20:16 ID:???]
- 後者は以下と同じこと
($hoge=gethostbyaddr(pack('C4',split/\./,$ENV{'REMOTE_ADDR'}),2)) or$ENV{'REMOTE_ADDR'};
- 114 名前:nobodyさん mailto:sage [2008/09/02(火) 17:30:48 ID:???]
- >>111
confessじゃだめか
- 115 名前:nobodyさん [2008/09/02(火) 17:37:04 ID:62/De0KZ]
- >>113
そういうものなんですね。ありがとうございました。
- 116 名前:nobodyさん mailto:sage [2008/09/02(火) 17:44:36 ID:???]
- >>114
confessも読んでいくと my $pkg = caller(++$i); unless(defined($pkg)) { みたいなことをしてループでネストの深さ調べてるから インクリメントしていると言える。 見かけ上自分でインクリメントしなけりゃいいならこれで いいんだろうけどな。
- 117 名前:nobodyさん [2008/09/02(火) 17:52:27 ID:IiWNBMxF]
- バイオインフォマティックスについて詳しい方いらっしゃいますか?
- 118 名前:nobodyさん mailto:sage [2008/09/02(火) 17:55:37 ID:???]
- >>114,116
ありがとうございます > my $pkg = caller(++$i); > unless(defined($pkg)) { こんなこと出来るんですね… すみません調べが足りず、callerに対して無効な範囲の引数を渡したら 落ちちゃうもんだとおもってました。 目的としては、余計な引数のリレーとかグローバル変数とか使わずに エラーサブだけでツリー生成することでしたので、下記のような感じでテストしてみます。 うまく行ったら〆報告します。 sub err { my ($sadd) = @_; my @return; my $i = 0; while(1) { my $s = caller($i); if (defined $s) { @return .= $s; } else { last; } $i++; } print STDERR $sadd."\n".(join ' / ', reverse @return); }
- 119 名前:nobodyさん [2008/09/02(火) 17:58:31 ID:IiWNBMxF]
- perlを使って突然変異前後における終止コドンのカウントをしたいんですが、初心者なのでまったく分かりません・・・(涙)
- 120 名前:nobodyさん mailto:sage [2008/09/02(火) 18:34:27 ID:???]
- >>114,116
抜粋ですが、下記でツリーというかパンくずリストというかそれっぽいものが出力できました。 ただ、ファイル名はrequireした元ではなく全て実行ファイル名になるようで、 あんまり意味無かったかも… >my $i = 0; >while (($package, > $filename, > $line, > $subroutine, > $hasargs, > $wantarray, > $evaltext, > $is_require, > $hints, > $bitmask) = caller($i++)) { > push @aTree, "$filename\($line\) $subroutine"; >} >my $sRev = join ' => ', (reverse @aTree); >print STDERR $sRev 以上、ありがとうございましたー >>118は無限ループっぽいのでご注意下さい
- 121 名前:nobodyさん mailto:sage [2008/09/02(火) 18:54:50 ID:???]
- ……(呆れている)
- 122 名前:nobodyさん mailto:sage [2008/09/02(火) 19:06:01 ID:???]
- >>121
なんで…? と思ってよくよく考えたら、confessそのまま使えばよかったのか…orz すみませんなにか焦りのままにわけのわからない事をしてしまったようで…orz
- 123 名前:nobodyさん mailto:sage [2008/09/02(火) 23:30:34 ID:???]
- >>119
perlじゃなきゃダメなの?
- 124 名前:nobodyさん mailto:sage [2008/09/02(火) 23:53:47 ID:???]
- >>123
> perlじゃなきゃダメなの? bioinformaticといえばperlってくらい。
- 125 名前:nobodyさん mailto:sage [2008/09/03(水) 02:01:14 ID:???]
- >>119
何の初心者かと言えばまず間違いなく Perl の初心者さんで、 バイオなんとかについては専門 (恐らく受講中) ということであれば、 # (この程度の情報はよこしてもよかろう、ケチんぼめ) 「バイオインフォマティクスのためのPerl入門」(ISBN4-87311-103-X) を買え。
- 126 名前:125 mailto:sage [2008/09/03(水) 02:16:22 ID:???]
- 追伸:
これを機会にPerlをイチから少々嗜んでおこうと考えたなら (または「バイオ(以下略)」のPerlに歯が立たなかったら)、 次の書籍から入るのが王道よん。 「初めてのPerl 第3版」(ISBN4-87311-126-9) いずれにせよこの手の応用なら計算のためのモデル化が必須で、 モデル化するためには当該分野の知識が必要、と。 数式にまで落し込んで示せば誰かコード例を書いてくれるかもね。 しかしそこまでできれば自分で書けちゃうよなあ。w
- 127 名前:nobodyさん mailto:sage [2008/09/03(水) 02:46:19 ID:???]
- 電算機言語を*嗜む*人向けのありがたいお話は
習い事板にでも書いて。
- 128 名前:nobodyさん mailto:sage [2008/09/03(水) 02:49:05 ID:???]
- Perlの入門書でいちばんいいのは
結城さんのだよ。 ほかのはむずかしすぎて(説明が下手すぎて)わかんないとおもう。
- 129 名前:nobodyさん mailto:sage [2008/09/03(水) 02:57:19 ID:???]
- 配布cgiを改造して覚えた。
ここをこう直せばこう行ける、みたいな経験則で。
- 130 名前:nobodyさん mailto:sage [2008/09/03(水) 05:15:42 ID:???]
- 経験則だけで行くと、習得に時間が掛かる上に変な癖がつく。
ラクダ本やPerldocなど読んで、基本をしっかりマスターすることが大切。 文法エラーが出なければ、なんでも良い訳じゃない事を知って欲しい。 特にファイルオープンのエラー処理を省く奴。
- 131 名前:nobodyさん mailto:sage [2008/09/03(水) 09:02:15 ID:???]
- >>128
お前の頭が悪すぎるだけ
- 132 名前:nobodyさん mailto:sage [2008/09/03(水) 09:20:14 ID:???]
- と変な癖が付いた人が言う
- 133 名前:nobodyさん mailto:sage [2008/09/03(水) 09:29:36 ID:???]
- Perl関係はドキュメント類が完備されているから、それでも質問に来るのは
頭の悪すぎる奴というのであってる。
- 134 名前:nobodyさん mailto:sage [2008/09/03(水) 11:33:27 ID:???]
- とドキュメントを残さない、不完全なドキュメントを残す人が言う
そして素人に最初から完璧な探し方を要求する
- 135 名前:nobodyさん mailto:sage [2008/09/03(水) 11:37:02 ID:???]
- ドキュメント読むひまがあったら人に聞くだろ、常考
- 136 名前:nobodyさん mailto:sage [2008/09/03(水) 11:59:41 ID:???]
- 以前、人のプログラムを見ては「変な癖がついてる」「変な癖がついてる」と
連発する新人が来て、一週間で営業に飛ばしたのを思い出した。
- 137 名前:nobodyさん mailto:sage [2008/09/03(水) 13:16:42 ID:???]
- なあ、もしかして英語読めないやつっているんじゃね? ありえないかな?
- 138 名前:nobodyさん mailto:sage [2008/09/03(水) 13:22:49 ID:???]
- 俺読めない。
- 139 名前:nobodyさん mailto:sage [2008/09/03(水) 13:40:17 ID:???]
- sub hoge ($$\@) {}
の($$\@)って何っていう名前だっけ?
- 140 名前:nobodyさん mailto:sage [2008/09/03(水) 13:48:18 ID:???]
- >>139
プロトタイプ
- 141 名前:nobodyさん mailto:sage [2008/09/03(水) 14:20:13 ID:???]
- 使用目的だけを読んで使い方が判るんだ
凄いな
- 142 名前:nobodyさん mailto:sage [2008/09/03(水) 22:23:50 ID:???]
- >>139 の「何っていう名前だっけ?」という質問に対して
>>140 はほぼパーフェクトな回答。 そもそもが知りもしないことを、余計な格好をつけるから そういう間の抜けたことになる。
- 143 名前:nobodyさん [2008/09/05(金) 06:53:30 ID:SLk/ayWJ]
- 読み込んだHTMLファイル内に直接書かれてる「@{foo[8..15]}」のような文字列を
配列として扱えるように置換したいんですが、どう書けばいいですか?
- 144 名前:nobodyさん mailto:sage [2008/09/05(金) 07:00:40 ID:???]
- 5.10動くレンタルサーバーの一覧はありますか?
- 145 名前:nobodyさん mailto:sage [2008/09/05(金) 08:42:28 ID:???]
- >>143
もっと違う方法を考えた方がいいと思う。
- 146 名前:nobodyさん [2008/09/05(金) 11:12:25 ID:SLk/ayWJ]
- >>145
大したCGIではないのでぶっちゃけどんな方法でもいいのですが、 後学のためにもこの方法でお願いしたいです。
- 147 名前:nobodyさん [2008/09/05(金) 12:29:59 ID:hg/3f6aE]
- use File::Copy;を使って
コピーする場合と、 OSのコピーコマンドを 使ってコピーする場合は どっちが高速ですか? また、常に上書きされるのでしょうか?
- 148 名前:nobodyさん mailto:sage [2008/09/05(金) 12:36:06 ID:???]
- >>147
最後に、 > 自分でマニュアルを読むのが面倒なので > 代わりに読んで説明してください。 とつけとけ。
- 149 名前:nobodyさん mailto:sage [2008/09/05(金) 12:59:01 ID:???]
- >>148
おまえがマニュアルを読んで 日本語で説明しろ! そして死ね!
- 150 名前:nobodyさん [2008/09/05(金) 13:12:50 ID:r9aXZuUN]
- use File::Copy;を使って
コピーする場合と、 OSのコピーコマンドを 使ってコピーする場合は どっちが高速ですか? また、常に上書きされるのでしょうか? 自分でマニュアルを読むのが面倒なので 代わりに読んで説明してください。
- 151 名前:nobodyさん mailto:sage [2008/09/05(金) 13:24:36 ID:???]
- ホラ、親切な>>149さん。やってあげなよ。
- 152 名前:nobodyさん mailto:sage [2008/09/05(金) 13:37:01 ID:???]
- OSの違いやその他の要因で違うからなんともいえないところだが、手元で50MBぐらいの
適当なファイルについて試したところでは % time cp hoge.log hg cp hoge.log hg 0.00s user 0.21s system 8% cpu 2.529 total % time perl -MFile::Copy -e 'copy "hoge.log","hg2"' perl -MFile::Copy -e 'copy "hoge.log","hg2"' 0.02s user 0.29s system 12% cpu 2.532 total これだけみるとcpの方がはやいかな? 気になる人は何回も条件変えたりしてやってみると良いよ。
- 153 名前:nobodyさん mailto:sage [2008/09/05(金) 13:37:22 ID:???]
- >>151
お前まだ死んでなかったんだ。
- 154 名前:nobodyさん mailto:sage [2008/09/05(金) 14:58:46 ID:???]
- >>152
システムコピーを使った場合どうなります?
- 155 名前:nobodyさん mailto:sage [2008/09/05(金) 15:15:12 ID:???]
- 質問する奴は>>1読んでからにしろ
- 156 名前:nobodyさん mailto:sage [2008/09/05(金) 20:38:54 ID:???]
- >>146 eval
>>147,154 計れ。
- 157 名前:nobodyさん mailto:sage [2008/09/05(金) 20:43:49 ID:???]
- >>146
方法を問わずなら、TT使っといて。 ttp://www.hakoniwa.net/tt/
|

|