トップページ⇒tech
1001コメント305KB

Perlについての質問箱 30箱目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/03/14(水) 22:54:12
"The duct tape of the Internet" こと、Perlについての質問箱です。
"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
0486デフォルトの名無しさん2007/05/08(火) 09:09:04
>>478
「大幅改良っ!!キメラぁぁ!!おにいちゃんかっこいいいいぃぃぃい ぃくううううう!」
0487デフォルトの名無しさん2007/05/09(水) 14:52:59
>>481
JavaScript 埋め込んでクリアすれば良いんじゃない?
0488デフォルトの名無しさん2007/05/10(木) 13:07:53
すみません、
・ローカル変数の一覧を取得する方法
・ハッシュの内容をローカル変数に一括して設定する機能(PHPのextract()関数に相当する機能)
があれば教えてください。
0489デフォルトの名無しさん2007/05/10(木) 13:32:01
>>488
use Dumpvalue とか。

hashの展開はこんなんでいけるだろ。
while (($key, $value) = each %hash) {
eval("\$$key = \$value");
}
ただし任意のキーが使われる場合はexploitになるんで別の方法で。
0490デフォルトの名無しさん2007/05/10(木) 13:56:22
デバッガでも作ろうというのでなければハッシュのまま使ったほうが
いいと思うよ。たぶんろくなことにならない。
0491デフォルトの名無しさん2007/05/10(木) 14:20:02
cpanなしでHTML::Entitiesをインストールする方法を教えていただけませんか。
「Perl "HTML::Entities" インストール」でぐぐってもヒットせず困ってます。
0492デフォルトの名無しさん2007/05/10(木) 14:58:35
>>491
OSは?
0493デフォルトの名無しさん2007/05/10(木) 15:06:48
ActivePerl(Win)だと初めから入ってるし、Unix系で「CPANなしで」ってのも
ピンと来ないし何だろう。「レン鯖で使いたい」なのかな。
04944912007/05/10(木) 15:50:52
>>492
Linuxです。Perl5.8。
>>493
その通り、海外のレンタルサーバーです。
ただ今はロ−カルのMacでやってるんで、CPANにトライしてみたんですが、最初にいろいろ英語できいてきて、適当に答えてたら設定がおかしくなったのか、
cpan install HTML::Entities
がfetchできないとかでインストールできませんでした。
CPANむずい・・・
0495デフォルトの名無しさん2007/05/10(木) 16:01:10
>>494
要するに、ロ−カルのMacにインストールできずに
> CPANむずい・・・
と言ってるわけだ。

こんなこと言っている人がCPANなしでレンタルサーバにインストール
しようってわけね。考えるだけ時間の無駄というものでしょう。
0496デフォルトの名無しさん2007/05/10(木) 16:04:37
>>491
READMEに書いてあるじゃん
0497デフォルトの名無しさん2007/05/10(木) 16:18:17
HTML-Parser-*.tar.gz ひろってきて展開して
perl Makefile.PL && make && make install
だけどcpanの英語がわからんとか言ってるレベルじゃもっと無理じゃね?
04984912007/05/10(木) 18:34:51
>>497
HTML::EntitiesはHTML::Parserの一部ということでしょうか。
試しにHTML::Parserをインストールしてみると・・・たしかにHTML::Entitiesも印ストールされました。
貴重なヒントをありがとうございました。
#こんな情報どこにあるんですか。http://www.xav.com/perl/site/lib/HTML/Entities.html とか見ても書いてないし。

ちなみにHTML::ParserはMacPortsをつかって
sudo port install p5-html-parser
でいけました。CPANは難しくて分からなかった人でもMacPortsなら楽勝!MacPorts万歳!
0499デフォルトの名無しさん2007/05/10(木) 18:37:45
そ、それはよかった
0500デフォルトの名無しさん2007/05/10(木) 19:02:37
>>498
http://search.cpan.org/dist/HTML-Parser/lib/HTML/Entities.pm
0501デフォルトの名無しさん2007/05/10(木) 19:08:36
>>498
http://search.cpan.org/ をブックマークしておくといいね。
0502デフォルトの名無しさん2007/05/10(木) 19:08:43
>>498
cpanモジュールなんだからcpanで調べろよ。

search.cpan.orgでHTML::Entitiesをサーチすれば一番上に出てくる

ttp://search.cpan.org/~gaas/HTML-Parser-3.56/lib/HTML/Entities.pm

を見れば一発でわかるだろ。
0503デフォルトの名無しさん2007/05/10(木) 22:17:13
Tkを使用して、GUIアプリを作成しています。

大きく二つのフレームから構成しています。
1.左フレーム
2.右フレーム

この二つのフレームにそれぞれScrollbarを設けたいのですが、
Frameウィジェットには何故か-yscrollbarオプション等が無く
Scrollbarウィジェットを動作させることができません。
Scrolledで強引に取り付けると、レイアウトがおかしくなります。
どうおかしくなるかというと、

1.Frame内部のウィジェットの配置が決まらない
(HTMLでいう、alignやvalignが効かない)
2.そもそも、実行時にワーニングのような表示が出る(実行はできる)

1.に関しては、スクロールバーを外せば正常に(期待通りに)配置されます。


Tkを使用される方は、こういうフレーム分けしたレイアウトで、
かつ各フレームにスクロールバーを表示させたい場合、どのような
ウィジェットの使い方をされるのか、教えていただけないでしょうか。
0504デフォルトの名無しさん2007/05/10(木) 22:51:49
Paneというものを見つけました。
Tk::Pane provides a scrollable frame widget.
Once created it can be treated as a frame, except it is scrollable.

自己解決です。
スレ汚し申し訳ありません。
0505デフォルトの名無しさん2007/05/10(木) 23:08:52
Tkのことは分からんけど、そういうときはコンテナにしたフレームの中に
それぞれウィジェットを作って、その中で更にスクロールバーを設けるんでないかい
0506デフォルトの名無しさん2007/05/10(木) 23:09:22
ずこー
リロードしときゃよかった
0507デフォルトの名無しさん2007/05/11(金) 02:34:36
($1, $2, $3, $4 ...)
に相当するような配列の表現はありますか?
0508デフォルトの名無しさん2007/05/11(金) 02:56:54
もっと詳しく
できるならやろうと思ってることも
0509デフォルトの名無しさん2007/05/11(金) 03:40:44
($name, $age, $sex) = ($1, $2, $3);
みたいな部分を、
($name, $age, $sex) = @foo;
とかで済ませられないかと
0510デフォルトの名無しさん2007/05/11(金) 05:02:32
これじゃ駄目?

my $str = 'name=名前,age=年齢,sex=性別';
my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/;

正規表現がアホなのは見逃して。
0511デフォルトの名無しさん2007/05/11(金) 08:22:51
おお
パターンマッチってリストで評価するとそれが返ってくるんだ
よくできてるなあ

でも、
my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/ || next;
という使い方はさすがに無理だった
0512デフォルトの名無しさん2007/05/11(金) 09:18:49
>>511
ヒントは演算子の優先順位

(my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/) || next;

または

my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/ or next;
0513デフォルトの名無しさん2007/05/11(金) 09:34:40
括弧の方にします

普通にパターンマッチをスカラーで評価した時は、
マッチしたかどうかを返すのに対して、
パターンマッチのリストでの評価の代入の評価は、
リストの要素数だから、動作は同じでも意味は違いますよね
0514デフォルトの名無しさん2007/05/11(金) 09:47:23
从*・ 。.・)<SEXよりかはGENDERまたはGENの方がいいかなと思うの
0515デフォルトの名無しさん2007/05/11(金) 11:34:00
ふつう、sex。
0516デフォルトの名無しさん2007/05/11(金) 11:37:09
>>514
入会申込書とかの該当欄に「週2回」って書いたたちか?
0517デフォルトの名無しさん2007/05/11(金) 11:54:30
なにそのゆとりんぐ回答
0518Aransk2007/05/11(金) 13:09:15
>509
何かこちらが勘違いしていたら、ゴメン。
でも、
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:30
じゃなくて、マッチングの結果のリストの表現方法のことです
0520デフォルトの名無しさん2007/05/11(金) 13:19:37
ここまで回答出て勘違いするってどういうことだよw
0521デフォルトの名無しさん2007/05/11(金) 17:13:50
>>511
木の実の問題だが、next / last を絡めると途端に可読性が低くなる
気がする。next を絡める予定なら普通に

next if $str !~ /name=(.*),age=(.*),sex=(.*)/ ;
my ($name, $age, $sex) = ( $1, $2, $3 );

でいいじゃんと遅レス。
0522デフォルトの名無しさん2007/05/11(金) 17:41:10
質問です。
Webで拾った以下の数値切り上げ関数を使用しています。
----------------------------------------
$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
>>522
丸め誤差でググっとけ。

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
銀行は四捨六入で0.5のときは一の位を見て切上げか切捨てを行う。
今回は全く関係ない。
0527デフォルトの名無しさん2007/05/11(金) 18:27:48
まず「期待したとおりの切り上げ結果」ってのがわからんのだが。
0528デフォルトの名無しさん2007/05/11(金) 18:34:21
>>522
> これを回避して、期待したとおりの切り上げ結果を返すにはどうすればいいでしょうか?

そんなどこの馬の骨ともわからないサブルーチンを使わずに、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
CPANに落ちてるのも作者が有名人なのを除くと
どこの馬の骨かわからないきがしなくもない

0531デフォルトの名無しさん2007/05/11(金) 21:10:46
>>530
有名な馬の骨もいるから気をつけな。
0532デフォルトの名無しさん2007/05/11(金) 21:20:42
麻雀の丸めは四捨六入
0533デフォルトの名無しさん2007/05/11(金) 21:24:12
>>521
現状はまさにそんな感じなんだけど、
($1, $2, $3) っていちいち書くのがなんか気持ち悪くて
どうせ内部で持ってそうなデータなのに
というのが質問の発端
0534デフォルトの名無しさん2007/05/11(金) 21:25:39
そういえばINT関数って、負の数について、
数直線の右に丸めるか左に丸めるかが
言語によって違うよね
0535デフォルトの名無しさん2007/05/11(金) 21:26:44
それで?
0536デフォルトの名無しさん2007/05/11(金) 22:07:13
あるフォルダ内のファイル(個数や名前は分からない)を一つずつ読んでいくにはどうしたいいでしょうか?
0537デフォルトの名無しさん2007/05/11(金) 22:10:48
ディレクトリを読んで、ファイル名を配列に入れて、
ループで回したら?
0538デフォルトの名無しさん2007/05/11(金) 22:13:24
>>536
use File::Slurp;

してread_dir
0539デフォルトの名無しさん2007/05/11(金) 22:13:51
opendir して、リストに対して readdir するか、readdir を while の中でぶん回して下さい
で、処理後は closedir で後始末を。

サブディレクトリも探したいなら再帰でググればヒントは見つかるかと思います
0540デフォルトの名無しさん2007/05/11(金) 22:16:59
実は glob で>>537の1行めまで片づく要件なのかもしれない。
0541デフォルトの名無しさん2007/05/11(金) 22:25:07
リストに入れないで済むならぶん回した方がいい
05425362007/05/11(金) 23:47:01
皆さんありがとうございました。
readdirをwhileでぶん回す方法でやってみます
0543デフォルトの名無しさん2007/05/12(土) 00:51:52
サブディレクトリまで検索するならFile::Findを使うのが簡単。
Unixの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:46
nkfと似たような動作するプログラムってPerlについてなかったっけ?
0546デフォルトの名無しさん2007/05/12(土) 03:16:52
>>544
sub flatten(@) { map { ref $_ eq "ARRAY" ? flatten(@$_) : $_ } @_ }

こんなんどうよ。
0547デフォルトの名無しさん2007/05/12(土) 03:25:10
回答しようとして>>546とほぼ同じ定義を書いていたが、
うごかなくて悩んでた。

eqじゃなくて==を使っていたぜorz
05485442007/05/12(土) 03:50:18
>>546-547
おお、ありがとうございます。
再帰を使うと意外とすっきり書けるもんですね。
頭が硬直化して思いつきませんでした。
ありがたく使わせていただきます。
0549デフォルトの名無しさん2007/05/12(土) 04:16:20
ActivePerlの時は、File::Findは使わずに自前で書いた方がいいよ。
パスのダメ文字が不完全だから、想定外の動作をする。
0550デフォルトの名無しさん2007/05/12(土) 04:17:18
×パスのダメ文字が不完全だから
○パスのダメ文字への対応が不完全だから
0551デフォルトの名無しさん2007/05/13(日) 02:20:04
例えば「__LINE__ ってどういう意味だったかな?」とかと思ったとき
それをperldocで調べようとすると、どういう風にコマンド叩けばいい?
そういう調べものにはperldocは向かない?
0552デフォルトの名無しさん2007/05/13(日) 03:04:18
podのディレクトリに移動してgrep
0553デフォルトの名無しさん2007/05/13(日) 12:02:01
$perldoc perl
して
Reference Manualのカテゴリーからあたりを見つけられるぐらいには慣れておいても損はないかも
0554デフォルトの名無しさん2007/05/13(日) 14:26:50
my $obj = new Foo::Bar::Baz($arg);
というコードで、クラス名を動的に指定するにはどうしたらいいですか。
$klass = 'Foo::Bar::Baz';
my $obj = eval "new $klass(¥$arg)";
$@ and die($@);
のようにevalを使うしかないのでしょうか。なんかもっとスマートな方法があるような気がします。
0555デフォルトの名無しさんNGNG?PLT(13092)
newする時にevalしなくてもおk
むしろパッケージが別ファイルならロード時に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:53
eval EXPR はインジェクションの可能性があるからなるだけ使わんほうがよいね。
0558デフォルトの名無しさん2007/05/13(日) 19:08:29
>>557
この一連のコードで具体的にどうやって?w
0559デフォルトの名無しさん2007/05/13(日) 19:20:02
そりゃサンプルコードなんだから汚染された文字列が紛れ込む分けなかろう
0560デフォルトの名無しさん2007/05/13(日) 19:59:57
やはり妄想で危険を煽っただけか。その妄想を極めればプールに入っただけで受精するとか言い出す外基地になれるよ。
0561デフォルトの名無しさん2007/05/13(日) 20:49:22
もうゴールデンウィークはおわったよ?
0562デフォルトの名無しさん2007/05/14(月) 06:21:05
影さん「evalがあればどんなプログラムでも書けるぜ!」
0563デフォルトの名無しさん2007/05/14(月) 13:44:05
文字列eval使わなくてもいいところで使うのはあんまり美しくないと思うけどな。
>>555のも eval { require $class }; のほうが綺麗だと俺は思う。
0564デフォルトの名無しさん2007/05/14(月) 15:48:00
NET::POP3とMIME::Parserを使ってメールの送信元で振り分けて処理をするプログラムを
作りたいんだけど、headのfromってメルアドが入ってなかったりしてどこをみたらいいかわかりません。
送信元メルアドを参照するにはどこをみたらいいんでしょうか?
0565デフォルトの名無しさん2007/05/14(月) 17:44:40
>>564
rfc2822を読め
0566デフォルトの名無しさん2007/05/15(火) 00:07:34
>>563
それを実行したことある?
0567デフォルトの名無しさん2007/05/15(火) 10:45:02
>>565
それじゃ何の答えにもなってないだろ馬鹿

>>564
ヘッダに送信元が正しく入っているかは保証されてないから入ってないときは取りようがないよ
0568デフォルトの名無しさん2007/05/15(火) 11:15:16
>>565
これからは全ての質問に「仕様書読め」「解説書読め」で解決していくんですか?
0569デフォルトの名無しさん2007/05/15(火) 11:26:10
Perlの質問じゃなくてメールの仕様に関する質問だからしゃあないのでは。
確かに不親切だけどね・・・
0570デフォルトの名無しさん2007/05/15(火) 13:35:28
>>568
なぜそうしたいの?
0571デフォルトの名無しさん2007/05/15(火) 14:19:50
570は小学校の国語をやり直した方がいいと思うの
0572デフォルトの名無しさん2007/05/15(火) 14:34:27
いま算数やってるの
0573デフォルトの名無しさん2007/05/15(火) 14:38:52
>>565 にレスしてる奴って全部 >>564 の自演だろ。
メールの仕様に関してはスレ違い。
0574デフォルトの名無しさん2007/05/15(火) 14:45:29
おお、帰ってきた。>>565が黄泉の国から帰ってきた。
0575デフォルトの名無しさん2007/05/15(火) 15:22:10
>>573
なんで>>564に>>567が自分で回答すんだよw
まあみんなやさしめに行こうよ。
0576デフォルトの名無しさん2007/05/15(火) 15:37:37
英語こわいからヤダヤダ
だからRFCなんか読むのもヤダヤダ
0577デフォルトの名無しさん2007/05/15(火) 15:51:24
もしかして「RFC」という文字列が荒しを板中から集めてる?
0578デフォルトの名無しさん2007/05/15(火) 15:55:46
全然荒れてねえだろwww
0579デフォルトの名無しさん2007/05/15(火) 16:17:56
>>565は、RFCを読んだことがあるのを自慢したいだけ。
0580デフォルトの名無しさん2007/05/15(火) 16:19:50
自慢てwwwゆとり乙www
0581デフォルトの名無しさん2007/05/15(火) 16:52:34
>>575
他人を装って自分を擁護するのって結構あるからな。
別に珍しくもないから、一応そう書いただけ。
0582デフォルトの名無しさん2007/05/15(火) 17:18:06
標準規格の類を挙げると必ず変な流れになるな。
0583デフォルトの名無しさん2007/05/15(火) 17:28:10
めんどくせぇから書きたいように書けよ
0584デフォルトの名無しさん2007/05/15(火) 21:53:54
昼間子供が書き散らしたようだな
0585デフォルトの名無しさん2007/05/15(火) 22:52:22
>>584
やっと起きたか、ひきこもり君
0586デフォルトの名無しさん2007/05/15(火) 23:36:02
どこを読めばわかるよってのも教え方の一つだと思うんだ
■ このスレッドは過去ログ倉庫に格納されています