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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/09/16(日) 19:49:43ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0002nobodyさん2007/09/16(日) 19:51:29ID:???
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル] (追加)
最新のドキュメント: ttp://search.cpan.org/dist/perl-5.8.8/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi
perldoc.jp: ttp://www.perldoc.jp/
Perldoc.com: ttp://www.perldoc.com/
0003nobodyさん2007/09/16(日) 19:52:04ID:???
ム板Perlスレより 2 of 2

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

[テクニック]
Perlメモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perlの小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8Unicodeメモ]
ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
000412007/09/16(日) 19:56:03ID:???
独断でPBPとPerl Hacksを追加してます。
0005nobodyさん2007/09/16(日) 20:04:09ID:???
>>1
お疲れ様です。
前スレ最後に質問してしまいました。
こちらに再投稿させていただきますm(__)m


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になる。
そんな現象を確認しました。

簡単な記述方法はないでしょうか。

0006nobodyさん2007/09/16(日) 20:22:00ID:???
>5
use bignum
0007nobodyさん2007/09/16(日) 20:40:18ID:???
>>6
???
どういうことですか?
英語読めませんが、http://perldoc.perl.org/bignum.html を見てやったところ
全くMath::BigFloatが不要になってしまいました。

冒頭でuse bignumをしておけば小数点の変な誤差が発生することは皆無になるんですか?
代償として重くなるとかがあるので、軽くしたいなら面倒でもMath::BigFloatを使えばいい。
簡単にしたいならbignumを使えばいい?
0008nobodyさん2007/09/16(日) 20:56:51ID:???
use bignum;
my $tr = (@array * (1-0.68)/2);

メチャクチャな計算になりました。
@arrayは100なので16になるべき計算なのに50が入ってました。
もちろんbignumをつかわなければ16が入ります。

bignumを使うと他にも多大な影響があるようですね。
どういう基準で影響を与えてくるんでしょうか。
0009nobodyさん2007/09/16(日) 21:58:06ID:???
>>前996
$#test
で最後の添え字をゲット。
0010nobodyさん2007/09/16(日) 23:09:56ID:???
>8
再現しない。再現する最小コードは?

use strict;
use warnings;
use bignum;
my @array;
$array[99] = 0;
print scalar(@array), "\n"; # 100
my $tr = (@array * (1-0.68)/2);
print "$tr\n"; # 16
0011nobodyさん2007/09/16(日) 23:24:10ID:???
>>10
#!/usr/bin/perl
#京
#use bignum;
my @array;
for (1..100){ push @array,$_ }
@array = sort {$a<=>$b} @array;
my $tr = (@array * (1-0.68)/2);
print $tr;

これでできると思います。EUCコードで記述されています。
use bignum;をコメントアウトするかしないかで表示が変わります。
本来とは違う挙動をしているのでしょうか?
0012nobodyさん2007/09/16(日) 23:35:36ID:???
普通にprintしていたものを、突如ファイルに納めたくなりました。

print 1;
というのが何千行もあった場合
print FH 1;
とやりなおすのは間に色々な式が挟まってる為一括ではできません。

標準出力先をファイルハンドルに変える設定などが冒頭でできるなら一発でできると思うのですが。
0013nobodyさん2007/09/16(日) 23:36:59ID:???
select関数でおk
0014122007/09/16(日) 23:53:18ID:???
>>13
うわ!
感謝感激恐悦至極にございますm(__)m
0015nobodyさん2007/09/17(月) 00:17:12ID:???
>11
俺のとこだと再現しないわ。環境は
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
This is perl, v5.8.8 built for cygwin-thread-multi-64int
0016nobodyさん2007/09/17(月) 00:32:28ID:???
>>11
どっちも16になるぜよ
0017nobodyさん2007/09/17(月) 00:44:08ID:???
>>15-16
This is perl, v5.8.1 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)

5.8.1のみの問題ですかね?
そんなに違いがあるのでしょうか。
一体何なのでしょうか?

ちなみにbignumって何に使うためのものなのですか?
浮動小数の誤差関係に使えるというのは一つですよね。
本筋はそれですか?

だとしたらこんな影響が出てしまう理由がわかりませんし。
EUCコードでやっておられますよね?
それかもしかしたらbignumの方がバージョン変わってるとか?
0018nobodyさん2007/09/17(月) 06:36:57ID:???
>>17
1. 再現せず。きちんと計算される。
This is perl, v5.8.1-RC3 built for darwin-thread-multi-2level

2. bignum は BigFloat と Math::BigInt, Math::BigInt::Lite のラッパー
それぞれググレ。でかい方に関しては
perl -le 'print 2**2**2**2**2' # => inf
perl -Mbignum -le 'print 2**2**2**2**2' # => やってみ?
とか
perl -le 'print 10**16' # => 1e+16
perl -Mbignum -le 'print 10**16' => 10000000000000000
効能が分るだろ。


0019nobodyさん2007/09/17(月) 07:36:15ID:???
前スレ993へ
% cat Hoge.pm
package Hoge ;
use 5.005_02 ;
use vars qw( @ISA @EXPORT ) ;
use vars qw( $hoge ) ;
use subs qw( hoge ) ;
use Exporter ;
use Cwd ;
@ISA = qw( Exporter ) ;
@EXPORT = qw($hoge hoge ) ;
$hoge = 42 ;
sub hoge{ return 42 ;}
1;

% perl -Mstrict -Mwarnings -MHoge -le 'print $hoge; print hoge'

ってか朝っぱらから何やってんだろ俺。
0020nobodyさん2007/09/17(月) 07:37:27ID:???
ああ、いらんモジュール use しとるし orz...
0021nobodyさん2007/09/17(月) 11:15:49ID:???
-wスイッチを使うと警告を出すというんですが、これは一体どういう意味の警告なんですか?
-cは確か構文チェックをしてくれるわけですよね。
0022nobodyさん2007/09/17(月) 11:37:55ID:???
print scalar(grep{$_>15}(1..99));
>84
print scalar(1..99);
>何も表示なし
print scalar(0,1,2);
>2

リストをscalarに渡すとどうなるかというのが知りたかったのです。
要素数を出してくるのか末尾要素だけ評価するのか。
真ん中のやつは何も評価しなかったようですが。何故なんでしょうか。

それとgrepでリストが作られるのかと思っていたら配列が作られているのですよね?これは。
scalar(配列)  とすると要素数が出てきて
scalar(リスト) とすると末尾要素が評価される
scalar(n..m)  とすると何も起こらない

grepの返り値は配列だということでokですか?
0023nobodyさん2007/09/17(月) 11:46:15ID:???
1/0
これをやらせるとIllegal division by zero at hogehogeと警告されます。
0/1
こっちは警告なしなので大丈夫なんだと思いますが。

あまり気にしてないと、無自覚のうちに0による除算が発生してしまうことってありますよね。
意識的に0による除算が行われないよう、例えば
my ($r,$p) = (rand,rand);
print $r/$p;
こういう場合は
my ($r,$p) = (rand,rand);
if ($p>0){ print $r/$p }
と保険?を掛けておくのが推奨されるコーディングなのでしょうか?
0024nobodyさん2007/09/17(月) 11:56:26ID:???
>>22
perl -w -le 'print scalar (1..99)'
Use of uninitialized value in range (or flip) at -e line 1.

range 演算子は、君の希望の挙動の他に
while( <> ){
 print if ( /^\s+/ .. /^$/ ) ;
}
つう風にも使う。で、上述ではperlの中の人がどっちの機能
を求めているのか判断出来ない。=> エラー出して保留
∴まともに機能してないよ
0025222007/09/17(月) 12:16:00ID:???
>>24
while( <> ){
 print if ( /^\s+/ .. /^$/ ) ;
}

読めないorz
正規表現の部分は「先頭から空白文字が1個以上あるか」「中身が空であるか」の二つですね。
で、..この範囲演算子はどういう意味でしょう?
ついでにwhileの評価式自体が皆目検討がつきません。
0026nobodyさん2007/09/17(月) 12:24:45ID:???
>>25
例だからあまり意味のないものを書いたんで。。。
 「先頭から空白文字が1個以上ある行」から
 「中身が空であるか」まで
 を出力せよ。
と言う意味になります。ホントは/^\S+/ のつもりだったのよw
後は、、、ぐぐれ。
0027212007/09/17(月) 12:26:13ID:???
すいません。試してるんですが。

Use of uninitialized value in addition (+) at 行数

こういうのやsubtractionとかがちょくちょく出てくるんです。
「初期化されてない値を使ってる」みたいな意味だと思いますが、
具体的にどういうエラーなのかわからず再現ができないでいます。
0028222007/09/17(月) 12:32:34ID:???
>>26
う〜んどうしてそうやって動くのでしょうか?
一旦中身が空である行を迎えたら自動でループはlastされるのですか?
ifに掛けられるのは1行ずつですよね。
う〜ん・・・
0029nobodyさん2007/09/17(月) 12:37:27ID:???
>>28
左の正規表現が真 => スイッチオン
右の正規表現が真 => スイッチオフ
for( 1..1000){
 print $_ if $_ == 10 .. $_ == 100 ;
}
つかまじでググってくれ。
21氏は質問の意味自体が理解不能だ。

俺は消えるので、相手してくれる人はいなくなるかもしらんが
頑張れ
0030212007/09/17(月) 12:38:16ID:???
my $pl = undef;
my $ze = $pl + 1;
my $we = $pl - 1;

レスこないのでガンばてたら、これでadditionとsubtractionエラーが再現できました。
この二つのエラーが出たら未定義値が格納されてる変数が計算に使われてるって思っておけばいいですよね。
でも一応スクリプト自体は動くんですが、-wはuse strict程度の感覚なのですか?
0031nobodyさん2007/09/17(月) 14:45:52ID:???
>>26
それ範囲演算子じゃないから。普通は使いません、ていうか使うな。
明らかに不適切な例を唐突に持ち出して何がしたいんだか。
0032nobodyさん2007/09/17(月) 15:07:46ID:???
>>31
ぐぐっても分らなかったのかw
■ このスレッドは過去ログ倉庫に格納されています