[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 22:14 / Filesize : 220 KB / Number-of Response : 914
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [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プログラミング板 pc8.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

www.perl.org/get.html
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3

前スレ
Perlについての質問箱 29箱目
pc11.2ch.net/test/read.cgi/tech/1166708139/

リンク集は>>2-3
過去スレは>>4

460 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 09:30:09 ]
> $_=m/3/
でなにをやっているのか良く考えてみ。


461 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 11:52:54 ]
>>460さん>
$_=m/3/ の部分を$_==3 にすると、うまく行きました!

最初$_==3でエラーが出て、良くわからなくて正規表現にすればうまくいくかなとか思って$_=m/3/に直して、(他の部分も少し直して、)それで3の時うまくいったのでてっきり正解かと思いこんでました。

$_=m/3/を$_==3と同じ意味で使ったつもりだったけど、動作は違うんですね。
もうちょっと調べてきます。
ありがとうございました。

462 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 12:40:19 ]
うまくいきました!
正規表現、はじめてで意味もよく知らずに=m/3/とかしてたけど、=~/3/とするのが正しかったんですね(汗
==3にすると数字以外の時の入力で(変数は数字ではありませんみたいな)無駄なエラーが出たけど=~/3/ならそういう変なエラーも出ないみたいなので=~/3/を使うことにしました!


$kyara=4;
while($kyara==4){
$_=<STDIN>;
if($_=~/3/){print"これはこねこ";$kyara=3}
elsif($_=~/2/){print"これはゴーレム";$kyara=2}
elsif($_=~/1/){print"これはドラゴン";$kyara=1};
};

もうちょっとがんばってきます!

463 名前:連カキスマソ mailto:sage [2007/05/07(月) 13:11:33 ]
もうちょっとがんばってきました(滝汗
if($_=~/3/){処理1}
elsif($_=~/2/){処理2}
とすると、3でも23でも32でも先に$_=~/3/にマッチしてしまう(32なんかは$_=~/2/にマッチさせたい)ので、ちょっと修正しました。


#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
$kyara=4;
while($kyara==4){
$_=<STDIN>;
if($_=~/3$/){print"あなたはお昼ね好きのこねこを選びました☆";$kyara=3}
elsif($_=~/2$/){print"あなたはお人よしのゴーレムを選びました☆";$kyara=2}
elsif($_=~/1$/){print"あなたは気の強いドラゴンを選びました☆";$kyara=1};
};
print "(番号=)$kyara";


これなら33111とかって入力でも3ではなく1のドラゴンとして判断してくれます☆

正規表現って便利ですね☆

>>460さん、アドバイスdクスでした!

464 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 13:18:31 ]
一つ攻略おめ
そこで更に便利な連想配列をどうぞ

465 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 13:19:13 ]
あっ、この場合だったら配列だけでいいのか

466 名前:460 mailto:sage [2007/05/07(月) 16:10:24 ]
462

なんか前向きなやつだなw
どっかの知恵袋のとは大違いだ。

ちょっと補足しておくと、Perlの場合処理対象の
変数を省略できることが多い。
たとえば $_ =~ /1/ なら /1/とか。
$_ = m/1/ と書いちゃうと、マッチの結果を
$_ に代入と解釈されて前の値を壊しちゃう。
ほかにもいろいろあるが長くなるので書かない。
まあがんばれ。



467 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 16:18:01 ]
>>459のチラ裏日記は、他人が見ても役に立ちそうだな。続けてくれ。

468 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 17:04:17 ]
てか
$inkey = <STDIN>;
これで読み取ったときって改行コード入ってない?
そこらへんも気をつけたほうがいいかな



469 名前:デフォルトの名無しさん [2007/05/07(月) 17:27:02 ]
XML::Parser::PerlSAX のエラーハンドリングについて、どなたかご存知でしたら教えてください。
Parse対象のXMLにエラーがあった場合に、ユーザー関数をコールバックさせようと考えています。

デフォルトだと
mismatched tag at line **, column **, byte ***, at
/user/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/XML/Parser.pm
line 187

のように出力されてdieします。



470 名前:デフォルトの名無しさん [2007/05/07(月) 17:27:31 ]
search.cpan.org/~kmacleod/libxml-perl-0.08/lib/XML/Parser/PerlSAX.pm

をみると、ParserがnewされるところでErrorHandlerに自分で作ったもの(例えばMyErrorHandler等)を指定すればよさそうなのですが、具体的になんという名前の関数を用意し、どのタイミングで呼び出されるかなど、よくわかりませんした。

すみませんが、どなたかお分かりでしたらアドバイスをください。


471 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 18:14:52 ]
使ったことないので分からんけど
ErrorHandlerに無名サブルーチンを渡しておけばパースに失敗したときにコールバックしてくれるんじゃないの?

472 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 18:37:28 ]
>>470
俺も使ったことないけど、フツーに考えて
$parser->{ErrorHandler}で例外をキャッチできるってことなんじゃなないの?

473 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 18:59:18 ]
>>466さん&>>468さん>
dクスです!参考にして少し書き換えました!

#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
while (<>){
if (/[1-3]$/) {chop;$kyara=chop;last;}
};

if($kyara==1){print"あなたはお昼寝好きのこねこを選びました☆"}
elsif($kyara==2){print"あなたはお人好しのゴーレムを選びました☆"}
elsif($kyara==3){print"あなたは強気なドラゴンを選びました☆"};

while (<>){};

こんな感じに☆

>>464さん>
必要になってからがんがります☆(コラ

474 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 19:00:38 ]
あ、よく見たら、ドラゴンとこねこが逆(汗

475 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 19:10:56 ]
キメラは?キメラはいないの?

476 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 19:14:49 ]
1しか押さないだろこれは・・・

477 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 19:27:33 ]
>>475が「イサキは?」に見えた。
配列や printf を覚えて欲しくなるけど、楽しみながらコツコツやってそうでいいな。

478 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 19:38:06 ]
>>475
ああ、大きなキメラが入るよ。 今年一番の大幅改良だ。



479 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 21:43:44 ]
たった今Perlにprintfやsprintfがあることを知った。
俺は車輪を10も20も発明していたらしい。すばらしい!

480 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 23:31:32 ]
むしろ、どういうルートで習得していけば
そいつらと鉢合わせずに済むか、を考えるのが難しいかも。

481 名前:473 mailto:sage [2007/05/07(月) 23:32:46 ]
質問してもいいでしょうか。。

print system("cls");
と書くと、PCではちゃんと画面クリアしてくれるんですが、サーバにアップしたら画面クリアしてくれませんでした。
ブラウザの画面をクリアする方法って無いんでしょうか・・?

あと、サーバにアップしたら、

while (<>){
if (/[1-3]$/) {chop;$kyara=chop;last;}
};

という部分も全て無視されました。
たぶん、while(<>)の部分がサーバでは無視されてしまってるんだと思うんですが、
どうすれば良いですか?
HTMLでフォームを表示させてそこから入力させるしか無いのでしょうか?

482 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 00:03:55 ]
clsはWinのコマンドだし (一応リンクは張ってはあるらしいが・・・)、
そもそも 「コンソールとブラウザの挙動を勉強してください」 としかいえない


ブラウザに対して print ""; でえぇんとちゃうのんかと


STDIN になんもデータ無いからあたりまえです

483 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 01:16:20 ]
これはどう見ても新手の荒らし

484 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 02:59:42 ]
>>481
荒らし以前に板違い。>>1

485 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 05:32:43 ]
すみません。
CGI以外の純粋なperlのみって書いてありますね。
気をつけます。

>>482
なんとなく理解しました。
clsをclearとしても無理だったので普通にフォームからの入力にします。

ご迷惑かけてすみませんでしたm(__)m

486 名前:デフォルトの名無しさん mailto:sage [2007/05/08(火) 09:09:04 ]
>>478
「大幅改良っ!!キメラぁぁ!!おにいちゃんかっこいいいいぃぃぃい ぃくううううう!」

487 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 14:52:59 ]
>>481
JavaScript 埋め込んでクリアすれば良いんじゃない?


488 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 13:07:53 ]
すみません、
・ローカル変数の一覧を取得する方法
・ハッシュの内容をローカル変数に一括して設定する機能(PHPのextract()関数に相当する機能)
があれば教えてください。



489 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 13:32:01 ]
>>488
use Dumpvalue とか。

hashの展開はこんなんでいけるだろ。
while (($key, $value) = each %hash) {
eval("\$$key = \$value");
}
ただし任意のキーが使われる場合はexploitになるんで別の方法で。

490 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 13:56:22 ]
デバッガでも作ろうというのでなければハッシュのまま使ったほうが
いいと思うよ。たぶんろくなことにならない。


491 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 14:20:02 ]
cpanなしでHTML::Entitiesをインストールする方法を教えていただけませんか。
「Perl "HTML::Entities" インストール」でぐぐってもヒットせず困ってます。

492 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 14:58:35 ]
>>491
OSは?

493 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 15:06:48 ]
ActivePerl(Win)だと初めから入ってるし、Unix系で「CPANなしで」ってのも
ピンと来ないし何だろう。「レン鯖で使いたい」なのかな。

494 名前:491 mailto:sage [2007/05/10(木) 15:50:52 ]
>>492
Linuxです。Perl5.8。
>>493
その通り、海外のレンタルサーバーです。
ただ今はロ−カルのMacでやってるんで、CPANにトライしてみたんですが、最初にいろいろ英語できいてきて、適当に答えてたら設定がおかしくなったのか、
cpan install HTML::Entities
がfetchできないとかでインストールできませんでした。
CPANむずい・・・

495 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 16:01:10 ]
>>494
要するに、ロ−カルのMacにインストールできずに
> CPANむずい・・・
と言ってるわけだ。

こんなこと言っている人がCPANなしでレンタルサーバにインストール
しようってわけね。考えるだけ時間の無駄というものでしょう。

496 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 16:04:37 ]
>>491
READMEに書いてあるじゃん

497 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 16:18:17 ]
HTML-Parser-*.tar.gz ひろってきて展開して
perl Makefile.PL && make && make install
だけどcpanの英語がわからんとか言ってるレベルじゃもっと無理じゃね?

498 名前:491 mailto:sage [2007/05/10(木) 18:34:51 ]
>>497
HTML::EntitiesはHTML::Parserの一部ということでしょうか。
試しにHTML::Parserをインストールしてみると・・・たしかにHTML::Entitiesも印ストールされました。
貴重なヒントをありがとうございました。
#こんな情報どこにあるんですか。www.xav.com/perl/site/lib/HTML/Entities.html とか見ても書いてないし。

ちなみにHTML::ParserはMacPortsをつかって
sudo port install p5-html-parser
でいけました。CPANは難しくて分からなかった人でもMacPortsなら楽勝!MacPorts万歳!




499 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 18:37:45 ]
そ、それはよかった

500 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 19:02:37 ]
>>498
search.cpan.org/dist/HTML-Parser/lib/HTML/Entities.pm

501 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 19:08:36 ]
>>498
search.cpan.org/ をブックマークしておくといいね。

502 名前:デフォルトの名無しさん mailto:sage [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

を見れば一発でわかるだろ。


503 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 22:17:13 ]
Tkを使用して、GUIアプリを作成しています。

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

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

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

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


Tkを使用される方は、こういうフレーム分けしたレイアウトで、
かつ各フレームにスクロールバーを表示させたい場合、どのような
ウィジェットの使い方をされるのか、教えていただけないでしょうか。

504 名前:デフォルトの名無しさん mailto:sage [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.

自己解決です。
スレ汚し申し訳ありません。

505 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 23:08:52 ]
Tkのことは分からんけど、そういうときはコンテナにしたフレームの中に
それぞれウィジェットを作って、その中で更にスクロールバーを設けるんでないかい

506 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 23:09:22 ]
ずこー
リロードしときゃよかった

507 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 02:34:36 ]
($1, $2, $3, $4 ...)
に相当するような配列の表現はありますか?

508 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 02:56:54 ]
もっと詳しく
できるならやろうと思ってることも



509 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 03:40:44 ]
($name, $age, $sex) = ($1, $2, $3);
みたいな部分を、
($name, $age, $sex) = @foo;
とかで済ませられないかと

510 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 05:02:32 ]
これじゃ駄目?

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

正規表現がアホなのは見逃して。

511 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 08:22:51 ]
おお
パターンマッチってリストで評価するとそれが返ってくるんだ
よくできてるなあ

でも、
my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/ || next;
という使い方はさすがに無理だった

512 名前:デフォルトの名無しさん mailto:sage [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;

513 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 09:34:40 ]
括弧の方にします

普通にパターンマッチをスカラーで評価した時は、
マッチしたかどうかを返すのに対して、
パターンマッチのリストでの評価の代入の評価は、
リストの要素数だから、動作は同じでも意味は違いますよね

514 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 09:47:23 ]
从*・ 。.・)<SEXよりかはGENDERまたはGENの方がいいかなと思うの

515 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 11:34:00 ]
ふつう、sex。

516 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 11:37:09 ]
>>514
入会申込書とかの該当欄に「週2回」って書いたたちか?

517 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 11:54:30 ]
なにそのゆとりんぐ回答


518 名前:Aransk [2007/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";
って普通に出来るけど?




519 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 13:12:30 ]
じゃなくて、マッチングの結果のリストの表現方法のことです

520 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 13:19:37 ]
ここまで回答出て勘違いするってどういうことだよw

521 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 17:13:50 ]
>>511
木の実の問題だが、next / last を絡めると途端に可読性が低くなる
気がする。next を絡める予定なら普通に

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

でいいじゃんと遅レス。


522 名前:デフォルトの名無しさん [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
という結果が返ってきました。

これを回避して、期待したとおりの切り上げ結果を返すにはどうすればいいでしょうか?


523 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 17:54:28 ]
なにを期待してるんだ?
そのceil関数は整数じゃなければ1足すってだけだろ

524 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 17:56:06 ]
>>522
丸め誤差でググっとけ。

perl -e 'print sprintf("%.50f", int((4.4 * 6000) * 1e6) / 1e6);'

525 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 18:02:20 ]
丸めには銀行方式が絡むか絡まないかがあるから気をつけろ
銀行の丸めは1桁が偶数のときに小数点以下があれば繰り上げだったっけ?
詳細忘れた

526 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 18:05:36 ]
銀行は四捨六入で0.5のときは一の位を見て切上げか切捨てを行う。
今回は全く関係ない。

527 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 18:27:48 ]
まず「期待したとおりの切り上げ結果」ってのがわからんのだが。

528 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 18:34:21 ]
>>522
> これを回避して、期待したとおりの切り上げ結果を返すにはどうすればいいでしょうか?

そんなどこの馬の骨ともわからないサブルーチンを使わずに、CPANで
Math-RoundとかMath-Round-Varとか拾ってきて見てみる。

実地の科学技術計算で使われている、充分な仕様のものがあるはず。



529 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 19:10:59 ]
付け焼刃的だが
$a = 1 if($var > 0 and $var != int($var));
ここの後半の比較式を
int($var) != int($var+0.9999・・・)
にするとか


530 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 20:54:42 ]
CPANに落ちてるのも作者が有名人なのを除くと
どこの馬の骨かわからないきがしなくもない



531 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:10:46 ]
>>530
有名な馬の骨もいるから気をつけな。

532 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:20:42 ]
麻雀の丸めは四捨六入

533 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:24:12 ]
>>521
現状はまさにそんな感じなんだけど、
($1, $2, $3) っていちいち書くのがなんか気持ち悪くて
どうせ内部で持ってそうなデータなのに
というのが質問の発端

534 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:25:39 ]
そういえばINT関数って、負の数について、
数直線の右に丸めるか左に丸めるかが
言語によって違うよね

535 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 21:26:44 ]
それで?

536 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 22:07:13 ]
あるフォルダ内のファイル(個数や名前は分からない)を一つずつ読んでいくにはどうしたいいでしょうか?

537 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 22:10:48 ]
ディレクトリを読んで、ファイル名を配列に入れて、
ループで回したら?

538 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 22:13:24 ]
>>536
use File::Slurp;

してread_dir



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

サブディレクトリも探したいなら再帰でググればヒントは見つかるかと思います

540 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 22:16:59 ]
実は glob で>>537の1行めまで片づく要件なのかもしれない。

541 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 22:25:07 ]
リストに入れないで済むならぶん回した方がいい

542 名前:536 mailto:sage [2007/05/11(金) 23:47:01 ]
皆さんありがとうございました。
readdirをwhileでぶん回す方法でやってみます

543 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 00:51:52 ]
サブディレクトリまで検索するならFile::Findを使うのが簡単。
Unixのfindを使ったことがあるならfind2perlでPerlのコードを生成できるよ。

File::Find
search.cpan.org/~nwclark/perl-5.8.8/lib/File/Find.pm

544 名前:デフォルトの名無しさん mailto:sage [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

545 名前:デフォルトの名無しさん [2007/05/12(土) 02:58:46 ]
nkfと似たような動作するプログラムってPerlについてなかったっけ?

546 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 03:16:52 ]
>>544
sub flatten(@) { map { ref $_ eq "ARRAY" ? flatten(@$_) : $_ } @_ }

こんなんどうよ。

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

eqじゃなくて==を使っていたぜorz


548 名前:544 mailto:sage [2007/05/12(土) 03:50:18 ]
>>546-547
おお、ありがとうございます。
再帰を使うと意外とすっきり書けるもんですね。
頭が硬直化して思いつきませんでした。
ありがたく使わせていただきます。



549 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 04:16:20 ]
ActivePerlの時は、File::Findは使わずに自前で書いた方がいいよ。
パスのダメ文字が不完全だから、想定外の動作をする。

550 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 04:17:18 ]
×パスのダメ文字が不完全だから
○パスのダメ文字への対応が不完全だから

551 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 02:20:04 ]
例えば「__LINE__ ってどういう意味だったかな?」とかと思ったとき
それをperldocで調べようとすると、どういう風にコマンド叩けばいい?
そういう調べものにはperldocは向かない?

552 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 03:04:18 ]
podのディレクトリに移動してgrep

553 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 12:02:01 ]
$perldoc perl
して
Reference Manualのカテゴリーからあたりを見つけられるぐらいには慣れておいても損はないかも

554 名前:デフォルトの名無しさん mailto:sage [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を使うしかないのでしょうか。なんかもっとスマートな方法があるような気がします。

555 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 16:22:37 BE:264938764-PLT(13092)]
newする時にevalしなくてもおk
むしろパッケージが別ファイルならロード時にevalしる

my $class = "Foo::Bar";
eval "require $class;"
die $@ if $@;
$class->new;

イマドキはUNIVERSAL::requireなんでしょうけど

556 名前:デフォルトの名無しさん mailto:sage [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;
};

557 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 16:49:53 ]
eval EXPR はインジェクションの可能性があるからなるだけ使わんほうがよいね。

558 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 19:08:29 ]
>>557
この一連のコードで具体的にどうやって?w



559 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 19:20:02 ]
そりゃサンプルコードなんだから汚染された文字列が紛れ込む分けなかろう

560 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 19:59:57 ]
やはり妄想で危険を煽っただけか。その妄想を極めればプールに入っただけで受精するとか言い出す外基地になれるよ。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<220KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef