トップページ⇒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
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
どこを読めばわかるよってのも教え方の一つだと思うんだ
0587デフォルトの名無しさん2007/05/16(水) 00:07:36
>>579
RFCを読んだことが自慢になると思っている時点で(ry

>>586
ざっとでも一通り目を通しておかないと他の部分の実装ですぐに詰まってまたスレ違いの質問してくるでしょ。
スタンドアローンアプリなら好きなように実装汁だけど
そもそもネットワークアプリは相互に協調するものなんだから
「とりあえず動いている」「自分だけよければいい」という存在は迷惑だろ。
0588デフォルトの名無しさん2007/05/16(水) 00:17:48
どうせただのメールフィルタなんだからどうだってかまわんだろう
0589デフォルトの名無しさん2007/05/16(水) 05:26:48
まぁ、仕様書は基本としても、それを守ってない場合も多々あるわけでw
0590デフォルトの名無しさん2007/05/16(水) 07:24:45
そうそう、RFC読まなくていい言い訳は
探せば結構見つかるよねw
0591デフォルトの名無しさん2007/05/16(水) 10:32:13
でもまぁ読むのだるいじゃん。
遠回りすぎるし。
必要だとは思うが。
0592デフォルトの名無しさん2007/05/16(水) 13:12:16
104で電話番号聞いたら電話帳読めって返すようなもんだもんな
0593デフォルトの名無しさん2007/05/16(水) 13:14:50
>>592
違うだろ。携帯販売店にどっかの会社の電話番号を聞くようなもん。
んなもん、104で聞け、つまりスレ違いだ。
0594デフォルトの名無しさん2007/05/16(水) 13:24:53
ここを104番に例えられると認識している人間がいるのも怖ろしいな。
0595デフォルトの名無しさん2007/05/16(水) 14:02:54
交番で道を尋ねたら「地図を見れ」ってのがしっくりくる
0596デフォルトの名無しさん2007/05/16(水) 14:18:25
104や交番は仕事だけど、ここはただの掲示板だ
0597デフォルトの名無しさん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:33
>>565が暴れてます
0600デフォルトの名無しさん2007/05/16(水) 15:59:25
義務ってわけじゃないだろうけど質問スレなんだから質問に答えたくない奴は
スルーすればいいだけなんじゃねーの?
それをわざわざ嫌味ったらしく書き込むから多いから荒れるんだよ。
黙ってろよ。
0601デフォルトの名無しさん2007/05/16(水) 16:15:12
>>598

print @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
>>600
逆だろ。「RFCを読め」という回答があっという間に返ってきたのに、
それを気に入らなかった奴が騒いでいる。わざわざ嫌味ったらしくね。
黙っていればいいのにね。
06035982007/05/16(水) 16:32:22
>>601
スカラーとして参照されたから、要素数を返したんですね。
詳しく説明していただけたおかげで、理解できたと思います。

ありがとうございました。
0604デフォルトの名無しさん2007/05/16(水) 16:36:58
>>601
部外者だが俺も勉強になった。ありがとう。
0605デフォルトの名無しさん2007/05/16(水) 17:27:58
>>567と>>568が発端になっているわけか。

まあみなさん、不足だと思ったら、攻撃しないで補うということで。
0606デフォルトの名無しさん2007/05/16(水) 19:05:20
ボク今夜寝る時、ママにRFC読んでもらうんだ。
0607デフォルトの名無しさん2007/05/16(水) 19:07:15
フーン
0608デフォルトの名無しさん2007/05/16(水) 19:33:23
⊂二二二( ^ω^)二⊃ フーン
0609デフォルトの名無しさん2007/05/16(水) 19:43:17
まぁ優しい俺が貼ってやるよ
ttp://www5d.biglobe.ne.jp/~stssk/rfcjlist.html
え、みんなこれ全部読んだの??
0610デフォルトの名無しさん2007/05/16(水) 19:48:27
荒らしてるのはいつも質問者
これ、豆知識な
0611デフォルトの名無しさん2007/05/16(水) 19:57:54
そうなの?
0612デフォルトの名無しさん2007/05/16(水) 20:17:47
そういえば質問者のフォロー全然ないな
0613デフォルトの名無しさん2007/05/16(水) 21:26:11
暴れ杉だろう・・・
業務で使うときでも読まないのかだぜ?
0614デフォルトの名無しさん2007/05/16(水) 21:34:58
さらに優しい俺が、>>565が指摘した該当文書を>>609から晒す

http://www.puni.net/~mimori/rfc/rfc2822.txt

次の人:
 上の文章からFromの仕様が書いてある文章を見つけ、行番号等の場所を報告

さらに次の人:
 的確に抜粋して、ここに書く

以上で当スレのミッションは終了となる。
0615デフォルトの名無しさん2007/05/16(水) 21:51:39
そーいや、番号がすぐ出てくるRFCって822(2822)と1149くらいだな、俺。
0616デフォルトの名無しさん2007/05/17(木) 00:28:17
>>565は、rfc2822読むのをやめへんでぇ〜
0617デフォルトの名無しさん2007/05/17(木) 02:12:42
RFC自重
0618デフォルトの名無しさん2007/05/17(木) 04:34:55
CRC556
0619デフォルトの名無しさん2007/05/17(木) 07:08:02
そろそろスレ違いで引っ張るの止めないか?…
RFC 読もうが読ままいが、perl についての質問に該当しなかった訳だし
RTFM ってのは最低限わきまえとく事だし
(ようするに俺も RFC 嫁よって思ってる訳だけど)
0620デフォルトの名無しさん2007/05/17(木) 10:16:00
   . ______________
   | i┬┬┬┬┬┬┬┬┬┬┬┬┬i |
   | |┼ ,r-l^i ‐┼y'⌒~}ー┼y'⌒~}ー┼| |
   | |┼と::_;;;:_}┼じ;_;:;ナ┼ヽ;:;:: :;;:;:;)┼| |
   | |┼┼┼┼┼┼┼┼┼┼┼┼┼| |
   | |┼f_:::_:;;;り┼{:;;;::_;;う┼( ;;:;:;:"")┼| |
   | |┼く:;;;_:;;Jー|ーじ;_;:;ナ┼f_::_::;;;;り┼| |
   | |┼┼┼┼┼┼┼┼┼┼┼┼┼| |
   |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  .|
     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

とりあえず焼肉でも食って落ち着こうぜ
0621デフォルトの名無しさん2007/05/17(木) 10:40:54
>>609
小説を読むわけじゃないんだから、必要なときに必要な箇所を読むんだよ。
0622デフォルトの名無しさん2007/05/17(木) 19:06:20
つうか今回の事でRFCが頭に入ったww
0623デフォルトの名無しさん2007/05/17(木) 20:59:23
パッケージの名前は「foo」のような小文字にするのか、それとも「Foo」のように
大文字で始めるのか、どちらがいいのでしょうか。
perl5.8.8のライブラリを見るとどちらもあるのですが、Perlの流儀だとどのような命名規則がいいのでしょうか。
0624デフォルトの名無しさん2007/05/17(木) 21:24:06
>623
foo みたいに小文字で始まってるのは pragma 扱いだと思う。
0625デフォルトの名無しさん2007/05/17(木) 21:28:28
根拠見っけてきた。

perldoc perlmodlib より
>Package/Module names are an exception to this rule. Perl informally
>reserves lowercase module names for 'pragma' modules like integer
>and strict. Other modules normally begin with a capital letter and
>use mixed case with no underscores (need to be short and portable).
0626デフォルトの名無しさん2007/05/17(木) 23:08:09
pragmaが何かわかりませんが、とりあえず自作のパッケージは大文字で始めるのがいいということでしょうか。
どうもありがとうございます。
0627デフォルトの名無しさん2007/05/18(金) 01:56:34
use strictとかは使ったことあるかお?そーいうことだお
0628デフォルトの名無しさん2007/05/18(金) 02:52:38
pragmaっつーのは端的に言えばインタープリタの動作を変えるもんだ。
よく見かけるのは"strict", "warnings","lib", "overload", "vars", "constant", "blib"あたりかな。
あとは、マルチバイト圏の人が"utf8", "encoding", "open"を使ってたりすることあるな。

P.S
分からないことは恥ではない、分からないことを放置することが恥なのだ
0629デフォルトの名無しさん2007/05/18(金) 03:08:16
baseも仲間に入れてあげてください;;
0630デフォルトの名無しさん2007/05/18(金) 03:14:05
あ、めんごw
baseはOOで継承するときに使うやつな。
よく使うのに、度忘れしてたw
0631デフォルトの名無しさん2007/05/18(金) 20:35:21
有限の整数の集合の中から偶数だけを取りだしてその数を2倍するといった
(1 2 3 4 5 6) -> (4 8 12)
みたいな処理を簡潔にperlで表現したいなら、どのように書くんでしょうか?
0632デフォルトの名無しさん2007/05/18(金) 20:42:42
map { $_ * 2 } grep { $_ % 2 == 0 } (1,2,3,4,5,6)
0633デフォルトの名無しさん2007/05/18(金) 21:20:39
自作のperl script にドラッグ&ドロップして使いたいんですが、
皆さん、どうされてます?
外部補助ツール等を使用しない方法で、perlのみで行いたいんです。
ググッてもうまくヒットしないので…恐縮ですが教えてください。
0634デフォルトの名無しさん2007/05/18(金) 21:22:10
>>633
すいません。WindowsXPでactiveperlの環境です。
0635デフォルトの名無しさん2007/05/18(金) 21:31:03
DropHandlerや{60254CA5-953B-11CF-8C96-00AA00B8708C}でググるといいと思うよ。
■ このスレッドは過去ログ倉庫に格納されています