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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん2007/05/30(水) 11:34:01ID:???
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc11.2ch.net/test/read.cgi/php/1171102883/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0984nobodyさん2007/09/16(日) 14:27:19ID:???
>>983
挙動は変らんよ。与えられたリストを全部もってく。
print root 3,4,5, print q{hoge} ;
なんてマネしたら当然1 が返る(sort の行をきちんと機能させた場合)
がそれは、
print &root( 3,4,5, print q{hoge}) ;
と同じわけで本来の挙動だ。

お前さんが prototype の事を質問しているのだとしたら全く別の話。
0985nobodyさん2007/09/16(日) 14:35:03ID:???
>>972
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod
> 括弧を使うときには、単純な (しかし、ときには驚く結果となる)
> 規則が適用できます: 関数に見えるならば、それは関数で、
> 優先順位は関係ありません。
0986nobodyさん2007/09/16(日) 14:42:55ID:???
こんにちわ。
コーディングとちょっと違うかもしれませんがお願いします。
test.plを実行すると自分のパソコンのスペックで15分くらいかかります。
ファイル操作とか何もしない、コード内完結型?のコードなので、処理をさせてる間
他の作業をパソコンでしたいのです。

簡単に言うとtest.plの完遂を待ってる時間に2ちゃんねるでもして暇をつぶしたいのです。
なので30分かかってもいいので、test.plのCPUやメモリの最大使用率を通常の1/2にしたいのです。
可能でしょうか?
09879632007/09/16(日) 15:21:39ID:???
>>966-968
う〜ん。なんか伝わってないような。

例えばsort関数が何をしているか視覚化して初心者に説明しなさい。
ってな時にsort関数のコードを渡せば自動で視覚化してくれるモジュールがあればなってことです。
自分でsort関数と同じ関数を作って、そこにごちゃごちゃと視覚化のためのコードを書くのは、
簡単な関数の時にしか「簡単じゃん」とは思えないですよね?

いや、簡単だというならsort関数の視覚化をこの場でやってもらえればいいんですけどね。
my @col = (4,6,2,98,2,1345,22);
この配列をsort関数がどういう手順でどういう事をしてるかを目で見えるようにするコードを「簡単に」どうぞ。
0988nobodyさん2007/09/16(日) 16:00:13ID:???
>>986
コードにメモリ食う個所がどれくらいあるか見ないとニンともカンとも・・
0989nobodyさん2007/09/16(日) 17:10:58ID:???
my @array;
for (1..100){ push @array,$_ }
@array = sort {$a<=>$b} @array;
my $tr = (@array * (1-0.68)/2);
print $tr;
print "\n";
splice @array,0,$tr;
splice @array,-$tr;
print "@array";

このコードですが、$trを表示すると16になります。
しかし$trをintすると15になります。
さらに、spliceに使われてる$trもどうも15として動いてるようです。

15.999999999という状態になっているのか。
こんな事があるなんておもいませんでした。
print すると整数のみなのに、実際は小数付きの数字という事は常に想定しておかないといけないことなのでしょうか?

print "\n\n";
print ($tr != 16);
をすれば1と表示されます。だからそんなに問題はない?
でもなんか混乱しています。何故こんなことになってるのでしょうか?
0990nobodyさん2007/09/16(日) 17:23:41ID:???
>>989
浮動小数点誤差の蓄積?
Math::BigFloat を試すと幸せになるかもしらん。
0991nobodyさん2007/09/16(日) 17:27:58ID:???
>>990
英語の説明しか身吊りません。orz
使い方がわからない。
0992nobodyさん2007/09/16(日) 17:33:39ID:???
>>991
すまんが、
ttp://corn.2ch.net/php/kako/988/988728069.html
の5〜10嫁。
0993nobodyさん2007/09/16(日) 17:51:31ID:rriFOokp
プログラム全体で使用する設定(各種パスやデータベースハンドルなど)を
別ファイルにまとめておきたいのですが、
どのような仕組みにすればいいのでしょうか。
例えばconf.pmに変数として$path=/home/...;
などと書いて、スクリプト本体でrequireしてprint $path;としてもダメですよね・・・
ダメダメな質問ですみませんが、お願いします。
0994nobodyさん2007/09/16(日) 17:53:04ID:???
>>992
すいませんでした。

use Math::BigFloat;
my @array;
for (1..100){ push @array,$_ }
@array = sort {$a<=>$b} @array;
my $tr = Math::BigFloat->new((@array * (1-0.68)/2));
print $tr;
print "\n";
splice @array,0,$tr;
splice @array,-$tr;
print "@array";

としましたら表示が16で、動作も16になってくれました。
これって結構重要なことですよね。
乱数とかを扱う場合特にちょっとした誤差でとんでもない違いが生まれてしまいますし。

で、一体なんなんです?
15.99999999になってるのは別にいいんです。比較でもちゃんと!=16で真出しますし。
なんでprintでは勝手に四捨五入されてしまう?のでしょうか。

誤差が気になるよりもprintでの表示が違う事の方が気になります。
0995nobodyさん2007/09/16(日) 17:58:04ID:???
とりあえず大きい小数点がいつ生まれるかわからないから、
誤差が怖い時は常にbigfloatに入れて使っておけばいいんですかね。
0996nobodyさん2007/09/16(日) 19:33:23ID:???
次スレはないんでしょうか?
ここで質問しても流されそうですが・・・

一応してみます。回答お願いしますm(__)m

@test[-10]の本来のインデックス番号?って簡単にわかりますか?
spliceしないで、頭10番目から末尾10番目を得たいんです。
ごちゃごちゃしないと無理ならspliceでもいいんですけれど。
0997nobodyさん2007/09/16(日) 19:52:40ID:???
Perlコーディング初心者質問スレ Part 56
ttp://pc11.2ch.net/test/read.cgi/php/1189939783/
0998nobodyさん2007/09/16(日) 19:57:31ID:???
>>996
初心者にもほどがあるってレベルなんだけど、釣りなのか?
本気なら、もう少し本なり入門サイトなり見てから質問してくれよ
0999nobodyさん2007/09/16(日) 20:01:49ID:???
use Math::BigFloat;
my $tr = Math::BigFloat->new((@array * (1-0.68)/2));

と書くの大変なので

my $a = use Math::BigFloat;
my $tr = $a->new((@array * (1-0.68)/2));

と書いてみましたがエラーでした。
こういう意図を実現するのは無理ですか?
小数の計算をさせた上で配列のインデックスにする場合はBigfloatしておかないと危ないです。
やってない$trに
$array[-($tr +1)];
とすると実質インデックスが2個変わってしまいます。
15.999だったのが、+で16になり、さらに1が足されて17になる。
そんな現象を確認しました。

簡単な記述方法はないでしょうか。
1000nobodyさん2007/09/16(日) 20:07:07ID:???
新しいスレに再投稿させていただきました。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。