Perlについての質問箱 30箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/03/14(水) 22:54:12"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3
前スレ
Perlについての質問箱 29箱目
http://pc11.2ch.net/test/read.cgi/tech/1166708139/
リンク集は>>2-3
過去スレは>>4
0514デフォルトの名無しさん
2007/05/11(金) 09:47:230515デフォルトの名無しさん
2007/05/11(金) 11:34:000516デフォルトの名無しさん
2007/05/11(金) 11:37:09入会申込書とかの該当欄に「週2回」って書いたたちか?
0517デフォルトの名無しさん
2007/05/11(金) 11:54:300518Aransk
2007/05/11(金) 13:09:15何かこちらが勘違いしていたら、ゴメン。
でも、
my @foo=qw(joe 25 male);
my ($name, $age, $sex) = @foo;
print $name,"\n";
print $age,"\n";
print $sex,"\n";
って普通に出来るけど?
0519デフォルトの名無しさん
2007/05/11(金) 13:12:300520デフォルトの名無しさん
2007/05/11(金) 13:19:370521デフォルトの名無しさん
2007/05/11(金) 17:13:50木の実の問題だが、next / last を絡めると途端に可読性が低くなる
気がする。next を絡める予定なら普通に
next if $str !~ /name=(.*),age=(.*),sex=(.*)/ ;
my ($name, $age, $sex) = ( $1, $2, $3 );
でいいじゃんと遅レス。
0522デフォルトの名無しさん
2007/05/11(金) 17:41:10Webで拾った以下の数値切り上げ関数を使用しています。
----------------------------------------
$one = ceil(19.1); # $one = 20
sub ceil {
my $var = shift;
my $a = 0;
$a = 1 if($var > 0 and $var != int($var));
return int($var + $a);
}
----------------------------------------
しかし、このceil関数に、(4.4 * 6000)という数値(26400)を引数として計算すると、26401が帰ってきます。
perl -e 'print sprintf("%.50f", (4.4 * 6000));';
を実行すると、
26400.00000000000363797880709171295166015625000000000000
という結果が返ってきました。
これを回避して、期待したとおりの切り上げ結果を返すにはどうすればいいでしょうか?
0523デフォルトの名無しさん
2007/05/11(金) 17:54:28そのceil関数は整数じゃなければ1足すってだけだろ
0524デフォルトの名無しさん
2007/05/11(金) 17:56:06丸め誤差でググっとけ。
perl -e 'print sprintf("%.50f", int((4.4 * 6000) * 1e6) / 1e6);'
0525デフォルトの名無しさん
2007/05/11(金) 18:02:20銀行の丸めは1桁が偶数のときに小数点以下があれば繰り上げだったっけ?
詳細忘れた
0526デフォルトの名無しさん
2007/05/11(金) 18:05:36今回は全く関係ない。
0527デフォルトの名無しさん
2007/05/11(金) 18:27:480528デフォルトの名無しさん
2007/05/11(金) 18:34:21> これを回避して、期待したとおりの切り上げ結果を返すにはどうすればいいでしょうか?
そんなどこの馬の骨ともわからないサブルーチンを使わずに、CPANで
Math-RoundとかMath-Round-Varとか拾ってきて見てみる。
実地の科学技術計算で使われている、充分な仕様のものがあるはず。
0529デフォルトの名無しさん
2007/05/11(金) 19:10:59$a = 1 if($var > 0 and $var != int($var));
ここの後半の比較式を
int($var) != int($var+0.9999・・・)
にするとか
0530デフォルトの名無しさん
2007/05/11(金) 20:54:42どこの馬の骨かわからないきがしなくもない
0531デフォルトの名無しさん
2007/05/11(金) 21:10:46有名な馬の骨もいるから気をつけな。
0532デフォルトの名無しさん
2007/05/11(金) 21:20:420533デフォルトの名無しさん
2007/05/11(金) 21:24:12現状はまさにそんな感じなんだけど、
($1, $2, $3) っていちいち書くのがなんか気持ち悪くて
どうせ内部で持ってそうなデータなのに
というのが質問の発端
0534デフォルトの名無しさん
2007/05/11(金) 21:25:39数直線の右に丸めるか左に丸めるかが
言語によって違うよね
0535デフォルトの名無しさん
2007/05/11(金) 21:26:440536デフォルトの名無しさん
2007/05/11(金) 22:07:130537デフォルトの名無しさん
2007/05/11(金) 22:10:48ループで回したら?
0538デフォルトの名無しさん
2007/05/11(金) 22:13:24use File::Slurp;
してread_dir
0539デフォルトの名無しさん
2007/05/11(金) 22:13:51で、処理後は closedir で後始末を。
サブディレクトリも探したいなら再帰でググればヒントは見つかるかと思います
0540デフォルトの名無しさん
2007/05/11(金) 22:16:590541デフォルトの名無しさん
2007/05/11(金) 22:25:070542536
2007/05/11(金) 23:47:01readdirをwhileでぶん回す方法でやってみます
0543デフォルトの名無しさん
2007/05/12(土) 00:51:52Unixのfindを使ったことがあるならfind2perlでPerlのコードを生成できるよ。
File::Find
http://search.cpan.org/~nwclark/perl-5.8.8/lib/File/Find.pm
0544デフォルトの名無しさん
2007/05/12(土) 02:54:05よい方法ご存知の方いませんか
@a = ([1,2,3], [4,5,6], [[7,8],[9,0]]);
@b = flatten(@a); # 1,2,3,4,5,6,7,8,9,0
0545デフォルトの名無しさん
2007/05/12(土) 02:58:460546デフォルトの名無しさん
2007/05/12(土) 03:16:52sub flatten(@) { map { ref $_ eq "ARRAY" ? flatten(@$_) : $_ } @_ }
こんなんどうよ。
0547デフォルトの名無しさん
2007/05/12(土) 03:25:10うごかなくて悩んでた。
eqじゃなくて==を使っていたぜorz
0548544
2007/05/12(土) 03:50:18おお、ありがとうございます。
再帰を使うと意外とすっきり書けるもんですね。
頭が硬直化して思いつきませんでした。
ありがたく使わせていただきます。
0549デフォルトの名無しさん
2007/05/12(土) 04:16:20パスのダメ文字が不完全だから、想定外の動作をする。
0550デフォルトの名無しさん
2007/05/12(土) 04:17:18○パスのダメ文字への対応が不完全だから
0551デフォルトの名無しさん
2007/05/13(日) 02:20:04それをperldocで調べようとすると、どういう風にコマンド叩けばいい?
そういう調べものにはperldocは向かない?
0552デフォルトの名無しさん
2007/05/13(日) 03:04:180553デフォルトの名無しさん
2007/05/13(日) 12:02:01して
Reference Manualのカテゴリーからあたりを見つけられるぐらいには慣れておいても損はないかも
0554デフォルトの名無しさん
2007/05/13(日) 14:26:50というコードで、クラス名を動的に指定するにはどうしたらいいですか。
$klass = 'Foo::Bar::Baz';
my $obj = eval "new $klass(¥$arg)";
$@ and die($@);
のようにevalを使うしかないのでしょうか。なんかもっとスマートな方法があるような気がします。
むしろパッケージが別ファイルならロード時にevalしる
my $class = "Foo::Bar";
eval "require $class;"
die $@ if $@;
$class->new;
イマドキはUNIVERSAL::requireなんでしょうけど
0556デフォルトの名無しさん
2007/05/13(日) 16:45:48----
package Foo::Bar::Baz;
sub new{ bless [] }
sub qux{ print "qux!!" }
package main;
eval{
my $klass = "Foo::Bar::Baz";
my $obj = new $klass;
$obj->qux;
};
0557デフォルトの名無しさん
2007/05/13(日) 16:49:530558デフォルトの名無しさん
2007/05/13(日) 19:08:29この一連のコードで具体的にどうやって?w
0559デフォルトの名無しさん
2007/05/13(日) 19:20:020560デフォルトの名無しさん
2007/05/13(日) 19:59:570561デフォルトの名無しさん
2007/05/13(日) 20:49:220562デフォルトの名無しさん
2007/05/14(月) 06:21:050563デフォルトの名無しさん
2007/05/14(月) 13:44:05>>555のも eval { require $class }; のほうが綺麗だと俺は思う。
0564デフォルトの名無しさん
2007/05/14(月) 15:48:00作りたいんだけど、headのfromってメルアドが入ってなかったりしてどこをみたらいいかわかりません。
送信元メルアドを参照するにはどこをみたらいいんでしょうか?
0565デフォルトの名無しさん
2007/05/14(月) 17:44:40rfc2822を読め
0566デフォルトの名無しさん
2007/05/15(火) 00:07:34それを実行したことある?
0567デフォルトの名無しさん
2007/05/15(火) 10:45:02それじゃ何の答えにもなってないだろ馬鹿
>>564
ヘッダに送信元が正しく入っているかは保証されてないから入ってないときは取りようがないよ
0568デフォルトの名無しさん
2007/05/15(火) 11:15:16これからは全ての質問に「仕様書読め」「解説書読め」で解決していくんですか?
0569デフォルトの名無しさん
2007/05/15(火) 11:26:10確かに不親切だけどね・・・
0570デフォルトの名無しさん
2007/05/15(火) 13:35:28なぜそうしたいの?
0571デフォルトの名無しさん
2007/05/15(火) 14:19:500572デフォルトの名無しさん
2007/05/15(火) 14:34:270573デフォルトの名無しさん
2007/05/15(火) 14:38:52メールの仕様に関してはスレ違い。
0574デフォルトの名無しさん
2007/05/15(火) 14:45:290575デフォルトの名無しさん
2007/05/15(火) 15:22:10なんで>>564に>>567が自分で回答すんだよw
まあみんなやさしめに行こうよ。
0576デフォルトの名無しさん
2007/05/15(火) 15:37:37だからRFCなんか読むのもヤダヤダ
0577デフォルトの名無しさん
2007/05/15(火) 15:51:240578デフォルトの名無しさん
2007/05/15(火) 15:55:460579デフォルトの名無しさん
2007/05/15(火) 16:17:560580デフォルトの名無しさん
2007/05/15(火) 16:19:500581デフォルトの名無しさん
2007/05/15(火) 16:52:34他人を装って自分を擁護するのって結構あるからな。
別に珍しくもないから、一応そう書いただけ。
0582デフォルトの名無しさん
2007/05/15(火) 17:18:060583デフォルトの名無しさん
2007/05/15(火) 17:28:100584デフォルトの名無しさん
2007/05/15(火) 21:53:540585デフォルトの名無しさん
2007/05/15(火) 22:52:22やっと起きたか、ひきこもり君
0586デフォルトの名無しさん
2007/05/15(火) 23:36:020587デフォルトの名無しさん
2007/05/16(水) 00:07:36RFCを読んだことが自慢になると思っている時点で(ry
>>586
ざっとでも一通り目を通しておかないと他の部分の実装ですぐに詰まってまたスレ違いの質問してくるでしょ。
スタンドアローンアプリなら好きなように実装汁だけど
そもそもネットワークアプリは相互に協調するものなんだから
「とりあえず動いている」「自分だけよければいい」という存在は迷惑だろ。
0588デフォルトの名無しさん
2007/05/16(水) 00:17:480589デフォルトの名無しさん
2007/05/16(水) 05:26:480590デフォルトの名無しさん
2007/05/16(水) 07:24:45探せば結構見つかるよねw
0591デフォルトの名無しさん
2007/05/16(水) 10:32:13遠回りすぎるし。
必要だとは思うが。
0592デフォルトの名無しさん
2007/05/16(水) 13:12:160593デフォルトの名無しさん
2007/05/16(水) 13:14:50違うだろ。携帯販売店にどっかの会社の電話番号を聞くようなもん。
んなもん、104で聞け、つまりスレ違いだ。
0594デフォルトの名無しさん
2007/05/16(水) 13:24:530595デフォルトの名無しさん
2007/05/16(水) 14:02:540596デフォルトの名無しさん
2007/05/16(水) 14:18:250597デフォルトの名無しさん
2007/05/16(水) 14:58:15別の通りすがりの人が食ってかかっているわけか。
「地図の見方を知ってるのを自慢したいだけ!!」と叫びながら。
0598デフォルトの名無しさん
2007/05/16(水) 15:44:27[初めてのPerl 3版]という本を読みながら勉強しているのですが、
3章の練習問題をしていて疑問に思いました。
@list = qw/ a b c d /;
print @list . "\n"; #こうすると、リストの個数が表示される。
print @list; #こうすると、リストの内容が表示される。
print @list , "\n"; #こうすると、リストの内容が表示される。
上記のように、3つの記述ほうほうで内容が変わってきます。
私が疑問に思ったのは、どうして"."で連結すると、リストの個数が
表示されるのでしょうか? また、","が急に出てきたのですが、どう
いった意味があるのでしょうか?
すみませんが、宜しくお願いします。
0599デフォルトの名無しさん
2007/05/16(水) 15:51:330600デフォルトの名無しさん
2007/05/16(水) 15:59:25スルーすればいいだけなんじゃねーの?
それをわざわざ嫌味ったらしく書き込むから多いから荒れるんだよ。
黙ってろよ。
0601デフォルトの名無しさん
2007/05/16(水) 16:15:12print @list . "\n";
まず、配列(ここでいう@listね)をprintすると配列の中身をすべて出力するのね。
それで↑は、@listと\nをつなげてひとつの文字列としてる。
配列はスカラ参照するとその要素数を返すから、「配列の要素数+改行」というひとつの文字列として出力される。
print @list;
これは上で言ったとおりそのまま配列の中身をぶちまける。
print @list , "\n";
printは出力対象をカンマで区切って複数指定できるのね。
だから、↑の場合は一つ目の例と違って@listと\nは別物として並列に並んでるのね。
print @list;
print "\n";
と同じというわけ。
だから配列の中身+改行となる。
0602デフォルトの名無しさん
2007/05/16(水) 16:18:22逆だろ。「RFCを読め」という回答があっという間に返ってきたのに、
それを気に入らなかった奴が騒いでいる。わざわざ嫌味ったらしくね。
黙っていればいいのにね。
0603598
2007/05/16(水) 16:32:22スカラーとして参照されたから、要素数を返したんですね。
詳しく説明していただけたおかげで、理解できたと思います。
ありがとうございました。
0604デフォルトの名無しさん
2007/05/16(水) 16:36:58部外者だが俺も勉強になった。ありがとう。
0605デフォルトの名無しさん
2007/05/16(水) 17:27:58まあみなさん、不足だと思ったら、攻撃しないで補うということで。
0606デフォルトの名無しさん
2007/05/16(水) 19:05:200607デフォルトの名無しさん
2007/05/16(水) 19:07:150608デフォルトの名無しさん
2007/05/16(水) 19:33:230609デフォルトの名無しさん
2007/05/16(水) 19:43:17ttp://www5d.biglobe.ne.jp/~stssk/rfcjlist.html
え、みんなこれ全部読んだの??
0610デフォルトの名無しさん
2007/05/16(水) 19:48:27これ、豆知識な
0611デフォルトの名無しさん
2007/05/16(水) 19:57:540612デフォルトの名無しさん
2007/05/16(水) 20:17:470613デフォルトの名無しさん
2007/05/16(水) 21:26:11業務で使うときでも読まないのかだぜ?
■ このスレッドは過去ログ倉庫に格納されています