1 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 03:03:00 ] "The duct tape of the Internet" こと、Perl についての質問箱です。 "There's more than one way to do it" ということで、 Perl の奥深さについて皆で語り合い、追求してまいりましょう。 CGI についての質問は板違いです。WEB プログラミング板でどうぞ。 CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。 (WEB プログラミング板: pc11.2ch.net/php/ ) CGI の質問は答えが Perl と全然関係ない話に帰着する場合が 多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 www.perl.org/get.html ● 2009/08/07 現在の最新版: 5.10.0 ▼ 前スレ Perlについての質問箱 40箱目 pc12.2ch.net/test/read.cgi/tech/1243631674/ リンク集は >>2-3 Perl 日本語処理の基礎の基礎 >>4 過去スレは >>5-6 あたり
477 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 08:05:51 ] BEGIN { require Test::Simple; import Test::Simple tests => 3; } とだいたい同じこと
478 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 08:31:50 ] >>477 仕組みを聞いているんじゃなくて、方法を聞いているんですけど。 じゃあ質問を変えます。importの引数はどうやって参照できますか。 たとえば「import Test::Simple tests=>3」のようにあったとして、Test::Simpleパッケージから「tests=>3」を参照する方法を教えてください。 ググったところ、「importの引数は@EXPORTや@EXPORT_OKに指定したものでインポートしたいものを指定する役割をもつ」と いうような説明があったのですが、この説明ではimportの引数を参照する方法がわかりませんでした。
479 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 08:50:27 ] ふくしの大学?に通ってるんですけど! package Unko; sub import { for(;;) { print @_; } } return 1; use Unko unko => "unko";
480 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 09:27:17 ] >>478 import呼ばれるんだからimport定義すればいいだけだろ。頭悪いの?
481 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 09:37:11 ] Test::Simple->import('tests', 3); イメージではこっちが分かりやすいかも。
482 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 11:01:35 ] >>475 24〜25-001-2009,28-001-2009に 27-001-2009が来たら、 24〜25-001-2009,27〜28-001-2009になるのか?メンドクサイなあ。同じく 23-001-2009が来たら、 23〜25-001-2009,28-001-2009になるの? 26-001-2009,28-001-2009に 27-001-2009がきたらどーすんのよ。 ルールが複雑すぎて正規化できないし、 ちょっとここでどうにかするproblemじゃない気がするんだが。 どっかに発注した方が早い気がする。って受注してるから困ってるんだよなww >>478 > 仕組みを聞いているんじゃなくて、方法を聞いているんですけど。 普通の人ならこの一言で一発で教えてやる気なくなるわな。 なんで誰もちゃんと教えてくれないかわかってないんだろ。 1つ勉強になったな。 関数の引数を参照する方法が分からないレベルなら、 Exporterはもうちょっと勉強してからいじった方がいいと思うな。
483 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 11:23:55 ] >>470 ありがとう。試してみます。
484 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 11:31:16 ] >>478 Test/Simple.pmにimport関数を作る。 -- Test/Simple.pm -- sub import { print @_; goto &{Test::Builder::Module::import}; #=>本来呼ばれるべきimport関数に飛ばす } @_の第1引数にパッケージ名(Test::Simple)が入っており、それ以降に use で指定した引数 が入っている。
485 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 12:12:54 ] >>484 CPANモジュールの中いじっちゃダメだろw
486 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 12:34:31 ] >>485 そうだね。 ごめん、ごめん。 >>484 でなく、以下を追加する。 BEGIN { package Test::Simple; sub import { print "@_"; goto &{Test::Builder::Module::import}; } }
487 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 12:53:08 ] >>479 ありがとうございます! import って関数なんですか?Perlの予約語だと思ってました。 477で >import Test::Simple tests => 3 のような書き方をしているんですけど、Test::Simpleのあとにコンマがない呼び出し方って、 予約語じゃなくてもできるんですか。Perlすごい。 あと、importを自分で定義すると use Exporter 'import' とバッティングしてしまうようなんですけど、 これは仕方ないことでしょうか。 >>480 頭は悪いです。すみません。 importは予約語だと思ってたので、再定義するという発想はありませんでした。 Perlは特殊変数が多いから、useの引数もきっと特別な変数かなんかで参照できるのだろうと思ってました。 やっぱりPerlは頭がいい人のための言語ですね。低能には難しすぎる。
488 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 13:08:52 ] >>486 数字のとこだけなら、1行で取り出せるよ。 ずっとソース読んでたw >>487 > あとにコンマがない呼び出し方って、 予約語じゃなくてもできるんですか。 sub hello{print @_} hello 'a'; 最初から何もしなくても出来るよ。 >バッティング それをオーバーライドという。オブジェクト志向における正しい挙動。 仕方ないんじゃなくてそれで合ってる。 > useの引数もきっと特別な変数かなんかで参照できるのだろうと思ってました。 なかなかいい勘をしていらっしゃる。必ず参照できるとは限らないけどね。この場合なら数字んとこは取れるよ。
489 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 13:09:34 ] 指向な。
490 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 13:25:29 ] オブジェクト歯垢
491 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 13:26:05 ] >>488 数字はどこかのパッケージ変数に入ってるの?
492 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 13:55:57 ] ハッシュのリファレンスがあるとき、 そのハッシュの浅いコピーのリファレンスを得る良い方法があれば教えてください。 my $foo = {}; my $bar = {%{$foo}}; とかいうのは思い付いたんですが、 もっとシンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法が あればお願いします。
493 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 16:45:47 ] >>491 ourな変数(オブジェクト)に入ってる。ソース読めば分かる。 >>492 日本語がよくわかんないです。
494 名前:492 mailto:sage [2009/09/19(土) 17:24:49 ] >>493 すみません、 >>492 の後半は、 「ほかにもっとマシな、あるいは俺ならこうする、という方法があれば教えてください」 ということで、ひとつよろしくお願いします。
495 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 20:11:31 ] >>494 いや、だから何をしたいのか分からないよその文章じゃ。 例もデリファレンスしてまたリファレンス作ってるだけだし なにがやりたいんだか不明。
496 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 21:45:09 ] >ハッシュの浅いコピーのリファレンス 意味不明
497 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 21:55:00 ] >>464 >>460-462 さんのを参考に、>>473-475 さんの仕様をもとに作成した。 use Data::Dumper; my @dates = qw( 24-001-2009 25-001-2009 26-001-2009 28-001-2009 ); print Dumper \@dates; for (0..10) { my ($index_add, $index_added) = (int rand @dates, int rand @dates); my ($date_add, $date_added) = ($dates[$index_add], $dates[$index_added]); print "\n[$index_add:$date_add] => [$index_added:$date_added]\n"; splice @dates, $index_added, 1, form_date( breakup_date($date_add), breakup_date($date_added) ); print Dumper \@dates; } sub breakup_date { my @dates; for my $date ( split /,/, $_[0] ) { if ( $date =~ /^(\d+)〜(\d+)(.*)/ ) { push @dates, map{ $_ . $3 } $1..$2; } else { push @dates, $date; } } @dates; }
498 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 21:55:44 ] >>497 の続き sub form_date { my (@formatted_dates, @stack); my @sorted_dates = map { $_->[0] } sort { $a->[1] cmp $b->[1] } map { [$_, join '-', reverse split /-/] } @_; for my $i (0..$#sorted_dates) { my ($cur, $next) = ($sorted_dates[$i], $sorted_dates[$i+1]); next if $next and $cur eq $next; if ( $next and eval "($next) - ($cur)" == 1 ) { @stack = @stack ? ($stack[0], $next) : ($cur, $next); } else { if (@stack) { $stack[0] =~ s/(?<=^\d{2})/'〜' . substr($stack[1], 0, 2)/e; push @formatted_dates, $stack[0]; @stack = (); } else { push @formatted_dates, $cur; } } } join ',', @formatted_dates; }
499 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 22:06:09 ] >>484 ,486 ありがとうございます!import関数を定義して、その中でgotoを使えばいいんですね。 gotoとか知らなかったので、import関数を定義しただけでは立ち往生してしまうところでした。 >>488 >sub hello{print @_} hello 'a'; >最初から何もしなくても出来るよ。 関数名と最初の引数との間のコンマは省略できるのは知っています。 そうじゃなくて、import test::Simple tests=>3 のような書き方だと、第1引数と第2引数の間の コンマも省略されていて、これは「何もしなくても出来る」ことはないからimportは予約語だと思ってました。 > それをオーバーライドという。オブジェクト志向における正しい挙動。 この場合はオーバーライドはまったく関係ないと思います。理由は継承関係を設定してないからです。 use Exporter 'import'; としただけでは継承関係は設定されませんよね?だからオブジェクト指向でいうオーバーライドとは関係ないんじゃないでしょうか。 >>482 >普通の人ならこの一言で一発で教えてやる気なくなるわな。 >なんで誰もちゃんと教えてくれないかわかってないんだろ。 >1つ勉強になったな。 ちゃんと教えてくれる親切な人は他にいたので助かりました。 あとimportが予約語じゃないというのはひとつ勉強になりました。
500 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 22:20:44 ] スタックのような動作をする(もちろんそれ以外にも色々と機能がある)オブジェクトを作ろうとして 標準の関数にならい、pushとpopを定義しました。 その中で標準のpushとpopを使うために、main::pushやmain::popと書いたのですが Undefined method &main::push などと言われてしまいます。 どのように書けば良いのでしょうか?
501 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 22:30:41 ] >>499 これを実行すればわかるんじゃないかな? package foo; sub func { print "@_\n" } func foo 1, 2; foo->func(1, 2);
502 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 22:41:31 ] >>499 こうすれば引数の内容をmainでも参照できるようになるよ。 use strict; use warnings; BEGIN { package Test::Simple; sub import { { no strict 'refs'; @{caller().'::test_args'} = @_[1..$#_]; } goto &{Test::Builder::Module::import}; } } use Test::Simple tests => 3; our @test_args; print "args = @test_args\n";
503 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 23:23:31 ] >500 (ユーザ定義でない)組み込み関数を使うならCORE::popとかCORE::pushとか。
504 名前:492 mailto:sage [2009/09/20(日) 00:20:11 ] >>495 うーん、コピーしたハッシュのデータのリファレンスを得たいのです。 > 例もデリファレンスしてまたリファレンス作ってるだけだし いや、そうはなってないと思うんですが。 my $foo = {}; printf "%s %s %s\n", $foo, \%{$foo}, {%{$foo}}; # => HASH(0x8103a48) HASH(0x8103a48) HASH(0x81038e0) $foo をデリファレンスしてまたリファレンス作った \%{$foo} は $foo と同一オブジェクトですが、 {%{$foo}} の方は $foo とは異なるオブジェクトになっていると思います。 後者のように、値がコピーされた別のオブジェクトを得たいです。 >>496 浅いコピー (shallow copy) って普通に言わないですかね?
505 名前:デフォルトの名無しさん [2009/09/20(日) 01:23:54 ] > my $foo = {}; > my $bar = {%{$foo}}; > もっとシンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法が いや、それで十分「シンプルかつ明解で効率良くモダンでよりスマートでスタイリッシュな方法」なんだが。 敢えて添削するなら括弧を1組み省略できる。 my $bar = {%{$foo}}; ↓ my $bar = {%$foo}; この辺りのリファレンス/デリファレンス、複合データ構造に関しては、オライリーの「プログラミングPerl」を読めば最低限の基礎情報は書いている。 さらに深く知りたければ「実用Perlプログラミング第1版」を読めばいいよ・・・と言いたいが、日本のお馬鹿な書店は「第1版」とは別物の「第2版」(第1版の追補版であって、改訂版ではない)しか置いてないから残念でした。 まー図書館とかを探してくれ。
506 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 06:24:05 ] >>499 import Test::Simple test => 3 は print FH 'hoge' と同じ構文 ちなみに new Hoge::Huga 'foo' と書けるけど、newはただの関数名だったりするのと同じ それから別に @ISA にパッケージ名をぶちこむのだけが継承でないし、new するだけがオブジェクト指向ではない もっと概念的なものだ あと一言いわせてもらうと余計な一言が多い
507 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 09:30:28 ] >>499 いや、そのスキルでgotoとか覚えるなよ。 一回脳から消せ。ろくなことがない。 > これは「何もしなくても出来る」ことはないから package Bob; sub run{print "Bob ran $_[1].\n"} package main; run Bob 'away'; # ここ -- Bob ran away. どこが? > ちゃんと教えてくれる親切な人は他にいたので助かりました。 CPANモジュールの名前空間いじっていじるのが「ちゃんと」なのかw 正直君のレベルでああいうハックを覚えるとろくなことがない。忘れろ。 もちっとマシな解答は別にあるし誰も答えてくれてないようだな。 > この場合はオーバーライドはまったく関係ないと思います。理由は継承関係を設定してないからです。 えっと、何のこと?ほんと一言多い人だな。 --- Test::Simple -- use Test::Builder::Module; our @ISA = qw(Test::Builder::Module); ---Test::Builder::Module; require Exporter; our @ISA = qw(Exporter); >>502 おまいらいい加減素人にgoto教えるの止めろ。
508 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 09:36:50 ] goto LABEL ならともかく goto &SUB; くらい許してやれよ
509 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 09:38:30 ] >>503 出来ました。COREというパッケージがデフォルトで読まれているのですね。 手元のラクダをよく読んだらCORE擬似パッケージと書いてありました…読み込みが足りなかったようです。 精進します、ありがとうございました。
510 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 09:39:41 ] >>502 ああ、同じ人か。普通のことのように書くなよ。素人相手にCPANモジュールの名前空間汚す ようなdirtyなハック教えて「できるようになるよ。 」じゃねーだろ。どんだけ無邪気だよ。 大規模開発の末端プログラマだったらどうすんだ?相手のレベルみて話しろ。他が迷惑するだろ。 Test::Simpleの挙動が変 -> Test::Simpleを再インストール -> 状況変わらず の不条理ループ開始。
511 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 09:40:12 ] たしかに 初期段階でgotoに触れてしまうと、全部そっちに逃げる思考になりがちだかんな
512 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 09:42:49 ] >>508 極力避けるべき方法だし、この人はsubとgotoの違いほとんど分かってないだろ。 そんな人に教えちゃダメだ。多分ここがなぜsubじゃなくgotoか説明できないと思われ。
513 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 09:56:19 ] >>511 だろ?俺はこの15年でgotoなんかプロダクトに使ったことなんかないぞ。 汚いことするからgotoが出てくる。その辺は分かるだろ? 例えばCatalystは61ファイル中1回もgoto使ってないぞ。 CPANを見渡すと、スピードがネックになるようなものや、コアな部分に触れるようなモジュールにgotoが多い。 でもYAMLで1回、Mooseで8回だ。素人が使うもんじゃないことくらいわかるはず。 >>478 > たとえば「import Test::Simple tests=>3」のようにあったとして、Test::Simpleパッケージから「tests=>3」を参照する方法を教えてください。 この時点で「普通はできません」と答えなかった住人の責任でもあるな。俺も含め。
514 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 10:21:29 ] open(NEWFILE, ">shinki.html") ; で自動的にshinki.htmlを作ってに書き込むようにしてるんだけど 下に自動的にフォルダも作って test/shinki.html に書き込むようにするにはどう書けばいいですか?
515 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 10:40:54 ] CPANモジュールの名前空間を汚さないエレガントな方法が知りたい
516 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 11:06:39 ] >>515 名前空間は汚さないが残念ながらエレガントな方法はない。また素人が真似するといかんので、 ヒントはTest::Builderが大事なものをourしちゃってるとこだ。ソース見れば一発で分かる。 正直相手が素人だと分かりきってるのに>>502 のような方法を提示する人の気が知れん。 ○○に刃物って言葉があるだろ。この素人さん、今後もつまらんことで他人のモジュール の内臓いじくりまわすに100ペリカ。困ったらgotoもすぐ発動するだろうな。
517 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 11:09:18 ] 立派な正義感(笑)がいるときいて
518 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 11:17:58 ] >>517 正解が出ないからって拗ねるな。
519 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 11:51:51 ] しつもん: 所持金0ですけど、新幹線で東京から博多まで行けますか? かいとう: 改札口を突破して猛ダッシュしろ まいらのやってることは、こんなレベル
520 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 12:02:03 ] >>505 バカなのはオライリーだろ。 中身が全然違う本を同じ題名で出す意味がない。
521 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 12:09:28 ] >>514 おれはそういうとき自力でフォルダを作ってるけど。他に方法あるのかな my $filepath = "test/shinki.html"; use File::Path; use File::Basename; File::Path::make_path( File::Basename::dirname($filepath) ); open(NEWFILE, ">$filepath");
522 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 12:28:34 ] Activeperl5.10.1,PAR-0.994,PAR-Packer-0.991を使用して exeファイルを作成した際 元のスクリプトにuse Encode;を使用していると exeファイル実行時に プロシージャエントリポイントPerl_croak_xs_usageがダイナミックリンクライブラリperl510.dl から見つかりませんでした とerrorが出るのですが解決方法(エラー文自体理解できてませんが)はありますでしょうか?
523 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 13:12:38 ] >>519 はげどー。 >>521 それが模範回答じゃないかなぁ。まあ他にモジュールがあるかも知れんが。 それか $filepath ~= s#([^/]+)$##; $filename = $1; system("mkdir -p $filepath"); って良い子は真似すんなよ。
524 名前:デフォルトの名無しさん mailto:sage [2009/09/20(日) 20:17:07 ] あとはPath::Class使う手もあるか use Path::Class::Dir; my $d = Path::Class::Dir->new('test', 'foo', 'bar'); $d->mkpath; my $f = $d->file('shinki.html'); my $fh = $f->openw;
525 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 06:32:33 ] >>4 を見て思ったのですが、 use utf8; use open IO => "encoding(cp932)"; use open ":std"; use Encode; でもいいんですかね?
526 名前:デフォルトの名無しさん [2009/09/21(月) 07:45:26 ] >>523 > それか > system("mkdir -p $filepath"); mkdir $filepath;
527 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 10:49:54 ] >526 それだと深いディレクトリ作れないだろ。./test/が存在しないときに./test/test2/test3/とか作れない。
528 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 11:48:00 ] なんのためにpオプション付けてると思ってんだよ
529 名前:528 mailto:sage [2009/09/21(月) 11:48:41 ] とても恥ずかしい
530 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 11:56:45 ] >>525 一箇所コロンが抜けてる……けど、無くても動くっぽい? use open IO => ":encoding(cp932)"; ファイルのエンコーディング設定も入るから、そこは注意。
531 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 13:49:14 ] system関数を使うのと、system関数の引数をWindowsコマンドプロンプトで直接実行したものの比較 system('mkdir -p a/b/c/d'); #Active Perl o / コマンドプロンプト x system('mkdir -p a\z\x\y'); #Active Perl o / コマンドプロンプト o system('mkdir b/b/c/d'); #Active Perl x / コマンドプロンプト x system('mkdir b\z\x\y'); #Active Perl x / コマンドプロンプト o x -- エラー o -- 成功 sysytem 関数とコマンドプロンプトでは、若干の違いがあるんだね。
532 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 14:16:06 ] >>531 Windowsでmkdirに-pオプション付けると "-p"って名前のフォルダが作られない? うちでは作られた
533 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 15:15:24 ] >>530 コロンが抜けていたのは自分のタイポですね。 すみません。 open.pmを見てみると、 $layer =~ s/^://; と、コロンを消してから処理をしているように見えます。 結局、コロンはあってもなくてもいいのかな?
534 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 18:02:29 ] >>533 付いてなくても動くかも知れないけど、PODでは付けることになってるし、 明文化されてない部分だから、付けといた方がいいと思う。
535 名前:デフォルトの名無しさん [2009/09/21(月) 20:50:57 ] >>527-529 > >526 > それだと深いディレクトリ作れないだろ。./test/が存在しないときに./test/test2/test3/とか作れない。 > $filepath ~= s#([^/]+)$##; > $filename = $1; > system("mkdir -p $filepath"); どーなんだろー?
536 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 22:11:09 ] >>>535 言う前にやってみろよw UN*X標準のmkdirはデフォルトでは1つのディレクトリしか作れないから。
537 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 00:02:13 ] Windows 2000 や XP だと中間ディレクトリが作られるね。 外部コマンドを利用する場合は特に、利用している OS などの環境を明確にしないと、 延々と話が噛み合わないで平行線を辿ると思う。 しかし、 >>531 を見ると、まあ言われてみれば納得できる挙動ではあるんだけど、 ActivePerl にはかなり黒魔術が入ってそうだねえ。 てか、折角 Perl はそういう OS の差異を吸収する層たり得るソフトウェアなんだから、 Perl でできることは極力 Perl でやるべきかと。
538 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 09:08:48 ] >>534 そうですね
539 名前:デフォルトの名無しさん [2009/09/22(火) 13:08:17 ] Perl TkのTextウィジェットを使って 文字列の入出力をする方法はどのようにするのでしょうか? Entryウィジェットを使ったサンプルはWeb上から見つけたのですが、 Textウィジェットを用いたものはないもので。。。
540 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 16:51:57 ] >>539 $text->delete('1.0', 'end'); # テキスト全て削除 $text->insert('end', $string); # 終わりから文字挿入 $string = $text->get('1.0', 'end'); # テキスト全て取得 ttp://www.shido.info/py/tkinter12.html search.cpan.org/~srezic/Tk-804.028/pod/Text.pod Indexは #INDICES 辺りを参照で。
541 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 21:06:14 ] すごい昔のレスを掘り返して何なんですが、以下レスの回答がありませんでした。 スマートな書き方ってないんですかね? Perlについての質問箱 12箱目 pc5.2ch.net/test/read.cgi/tech/1094579428/941 941 名前:デフォルトの名無しさん[] 投稿日:04/10/14 18:57:50 条件によって、関数に渡す引数の数が違う場合 たとえば my $obj; if (/condition/) { $obj = Class->new(ARG_0 => "a", ARG_1 => "b", ARG_2 => "c",); } else { $obj = Class->new(ARG_0 => "a", ARG_1 => "b",); } という具合の書き方をいつもしているのですが なんだか重複した記述が多いし、もうちょっとスマートな書き方がないものかと いつもうんざりしています。 こういう場合の定石パターンってなにかあるのでしょうか。 皆さんどうコーディングされてます?
542 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 21:27:52 ] my %args = (ARG_0 => 'a', ARG_1 => 'b'); $args{ARG_2} = 'c' if CONDITION; my $obj = Klass->new(%args);
543 名前: ◆TWARamEjuA mailto:sage [2009/09/22(火) 21:47:01 ] my $obj = Class->new(ARG_0 => "a", ARG_1 => "b", /condition/ ? ARG_2 => "c" : undef => undef); って通るのかしら?
544 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 22:03:42 ] >>541 重複しないことが必ずしもスマートとは限らない。 現状のままの方が読みやすい気がする。
545 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 22:19:16 ] >>542 若造がいきがってムチャしてる、って感じがするな。 後々のことを考えてるのかな。 その場かぎりの使い捨てコードならソレでもいいかもしれないけど。
546 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 22:48:50 ] my @params = ( ARG_0 => "a", ARG_1 => "b", ARG_2 => "c" ); my $obj = Class->new( /condition/ ? @params[0..3] : @params[0..5] );
547 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 23:09:07 ] >>546 もういいからやめろ
548 名前:デフォルトの名無しさん [2009/09/22(火) 23:32:46 ] >>541 本当にARG_2がoption的な要素なら、 my %opt = ( ARG_2 => 'c' ) if /condition/; my $obj = Class->new( ARG_0 => "a", ARG_1 => "b", %opt, ); って書き方するかなぁ。 そうじゃないなら>>544 の言う通り、そのままの方がメンテしやすい
549 名前:デフォルトの名無しさん [2009/09/23(水) 00:57:59 ] まじキチ…ユダヤが人工地震を起こすぞ 【緊急情報カクサンよろしく】 ついに来ました。 大きい動きです。250nT超えてきました。ほぼ間違いありません。もう一度言います。 友人、知人、親類縁者、あらゆるつながりを駆使して巨大地震がくることを教えて下さい。 四川地震より大きいのが来る可能性があります。 g ★olde★ntam★atama.b★lo★g84.fc2.c★om/ ★★★★★危険度MAX★★★★★ ★★★★★★★★★★★★★★★★ ★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★ ★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★ ★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★ ★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★ ★★★★★★★★★★★★★★★★ ★★★★★危険度MAX★★★★★ 警告!連休中の21、22、23日が危ない!かも2 live24.2ch.net/test/read.cgi/eq/1 ★253494015/ 【大気イオン】e-PISCO Part11【また延長】 live24.2ch.net/test/read.cgi/eq/1 ★252991726/ 本当に地震が来たら、犯人は特権階級全員だということ2
550 名前: ◆TWARamEjuA mailto:sage [2009/09/23(水) 01:28:09 ] 1200件もhitするのか。。。 ひとまずRock54してくるです。。。
551 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 07:56:28 ] コードゴルフ用の問題みたいだね
552 名前:デフォルトの名無しさん [2009/09/23(水) 13:49:46 ] >>541 もし毎回同じパラメータ渡してるなら、サブルーチンの受け取るパラメータを直す。 それが難しければ、ラッパーをかます。 ベタウチはバグの元。 プログラム書法にも書かれてる。 「汚れ仕事は機械にやらせよう」 ただし、同書は冒頭で戒めてるので注意。 「わかりやすく書こう。うますぎるプログラムはいけない」 根拠は可読性とメンテナンス性。
553 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 17:32:22 ] こっち↓ my $data = do{local $/; <$fh>}; と、こっち↓ read $fh, my $data, -s $fh; では、どちらを使うのがいいのでしょうか?
554 名前:デフォルトの名無しさん [2009/09/23(水) 17:48:49 ] >>553 どっちもだめ。 【理由】意図不明
555 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 17:52:10 ] どっちでもいいんじゃね 効率はやや上のほうがよさそうだけど。下はファイルサイズ調べに行かなきゃならんわけだし
556 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 18:24:04 ] >>554 これを意図不明って、絶望的にPerlのスキルが足りないんじゃね?
557 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 19:58:27 ] tp://www1.axfc.net/uploader/Sc/so/28995.zip&key=vip ネットの勉強がてらに作ったモノです 友人に見せたら汚いコードだと言われました どこあたりがおかしいのでしょうか
558 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 21:09:19 ] >>555 ベンチマークを取ってみた。 Windows XP SP2、ActivePerl 5.8.8 _______________________________________________________________ use Benchmark qw(:all); my $file = 'jcode.pl'; # 21,876bytes、785行 my $r = timethese( 10000, { 'local $/' => sub { open my $fh, $file or die $!; my $data = do { local $/; <$fh> }; }, 'read' => sub { open my $fh, $file or die $!; read $fh, my $data, -s $fh; } }); cmpthese $r; ____________________________________________________________________________ Benchmark: timing 10000 iterations of local $/, read... local $/: 4 wallclock secs ( 2.81 usr + 1.09 sys = 3.91 CPU) @ 2559.51/s (n=10000) read: 3 wallclock secs ( 1.77 usr + 1.06 sys = 2.83 CPU) @ 3534.82/s (n=10000) Rate local $/ read local $/ 2560/s -- -28% read 3535/s 38% --
559 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 21:12:42 ] >>557 こんなもんじゃないの。 少なくとも昔の2chのコードより100倍まし。
560 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 21:12:51 ] へぇー。 -s & readの方がはやかったか〜 まぁ、言われてみれば 読み込む量があらかじめわかってりゃそりゃバッファの確保も楽(っていうか一発?)だしそりゃ速いわな
561 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 21:31:51 ] ついでに、sysreadもベンチを取ってみた。 条件は、>>558 と同じ。 Benchmark: timing 10000 iterations of local $/, read, sysread... local $/: 4 wallclock secs ( 2.66 usr + 1.14 sys = 3.80 CPU) @ 2633.66/s (n=10000) read: 3 wallclock secs ( 1.75 usr + 1.06 sys = 2.81 CPU) @ 3556.19/s (n=10000) sysread: 1 wallclock secs ( 0.33 usr + 0.91 sys = 1.23 CPU) @ 8103.73/s (n=10000) Rate local$/ read sysread local $/ 2634/s -- -26% -68% read 3556/s 35% -- -56% sysread 8104/s. 208% . 128% --
562 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 21:33:02 ] activeperl のverで 5.8.9.826 と 5.10.1.1006 での差違って 主に何です? ご存じの方いませんか
563 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 21:41:54 ] >562 www.activestate.com/activeperl/features/ のActivePerl 5.10 Highlightsは見たの?
564 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 22:15:20 ] binmode $fh; をかましてバイナリ読み込みにすると、差が縮まった。 Benchmark: timing 50000 iterations of local $/, read, sysread... local $/: 9 wallclock secs ( 2.64 usr + 5.34 sys = 7.98 CPU) @ 6262.53/s (n=50000) read: 8 wallclock secs ( 2.03 usr + 5.47 sys = 7.50 CPU) @ 6666.67/s (n=50000) sysread: 6 wallclock secs ( 1.72 usr + 4.61 sys = 6.33 CPU) @ 7900.14/s (n=50000) Rate local$/ read sysread local $/ 6263/s -- -6% -21% read 6667/s 6% -- -16% sysread 7900/s. 26% 19% -- ただ、読み込むファイル容量を大きくする(以下)と差が出る。 my $file = 'kakikomi.txt'; # 6,863,205bytes(≒6.5Mbytes)、271,365行 Benchmark: timing 300 iterations of local $/, read, sysread... local $/: 6 wallclock secs ( 4.45 usr + 2.08 sys = 6.53 CPU) @ 45.93/s (n=300) read: 4 wallclock secs ( 2.02 usr + 2.06 sys = 4.08 CPU) @ 73.58/s (n=300) sysread: 4 wallclock secs ( 0.08 usr + 3.11 sys = 3.19 CPU) @ 94.13/s (n=300) Rate local$/ read sysread local $/ 45.9/s -- -38% -51% read 73.6/s 60% -- -22% sysread 94.1/s. 105% 28% --
565 名前:デフォルトの名無しさん [2009/09/23(水) 23:23:06 ] この方が分かりやすい。 my $data=`cat $file`;
566 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 23:53:34 ] どうでもいいんだが、 #=> こいつがちんぽに見えてしょうがない どうにかならんか
567 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 00:36:07 ] 毛を剃れば=>になる
568 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 02:08:46 ] perlでwmvの再生時間を取得したくて、調べていて Image::ExifToolというモジュールで出来るようだということがわかりました。 具体的なソースコードがないので、どのようにwmvの再生時間を取得すればいいのか悩んでいます。 よろしければ再生時間の取得方法が載っているサイトなど教えていただけたらと思います。
569 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 02:40:20 ] ソースコードが無いってなんで? これでしょ? search.cpan.org/~exiftool/Image-ExifTool-7.89/lib/Image/ExifTool.pod
570 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 10:29:03 ] cpan をユーザーディレクトリで運用したいです 書かなければならないとする設定が説明サイトによってまちまちなんですが、 最新版ではどう記述するのが本当なんですか?
571 名前:デフォルトの名無しさん [2009/09/24(木) 13:33:50 ] 以下の2つの結果が違うのですが、 print join(',', (1,'','','',2)), "\n"; print join(',', (1,,,,2)), "\n"; perlでは,,,というのはどういう解釈がなされるのでしょうか? -------- JavaScriptみたいな結果を期待していたのですが・・。 alert([1,,,,2].join(',')); // -> 1,,,,2
572 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 14:09:42 ] >>571 perldoc.jp/docs/perl/5.10.0/perldata.pod より: 空リストは () で表わされます。リスト中で空リストを展開しても何も起こりません。 つまり、 ((),(),()) は () と等価です。同様に、要素のない配列を展開することは、 その場所に何も展開しなかったのと同じことになります。 この展開は、開きかっこと閉じかっこは(優先順位のための必要性がなければ) 省略 可能であるということと、リスト中に複数のカンマがあっても文法的に有効なので、 リストの最後に追加のカンマをつけられるということを組み合わせたものです。 リスト 1,,3 は 2 つのリスト 1, と 3 の結合であり、 1 つ目のリストはオプションのカンマ で終わっています。 1,,3 は (1,),(3) で 1,3 です (そして同様に 1,,,3 は (1,),(,),3 で 1,3 です。以下同様。) この暗黒面を使うよう勧めているわけではありません。
573 名前:デフォルトの名無しさん [2009/09/24(木) 15:09:05 ] >>572 ありがとう御座います。ズバリです! 納得いきました。
574 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 16:07:02 ] >>564 バイナリリードにすると差がなくなるのは、<$fh>方式では、バイナリリードだと確保するバッファーが 大きくなるからでしょうか?
575 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 16:34:29 ] 多重定義されたメソッド(関数)で、2つ上のメソッドを呼び出すにはどうすればいいのでしょうか? package Super; sub foo { print "This is Super\n" } package Sub; use base Super; sub foo { print "This is Sub\n" } package SubSub; use base Sub; sub foo { print "this is SubSub" } sub call_super_foo { shift->SUPER::SUPER::foo) } #=> エラー package main; SubSub->call_super_foo; #=> This is Superを期待
576 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 17:36:56 ] shift->Super::foo とか Super::foo(shift) じゃだめ?絶対的な指定になっちゃうけど。 二つ上っていう相対的な呼び出し方はわかんね っていうか、そういうことがやりたいケースなんてあるかな?ちょっと興味あるアル
577 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 18:11:57 ] ディスパッチャーを自作すればいけるかー。evalでもいいけど package UNIVERSAL; sub dispatch_ancestor_method { my ($self, $name, @args) = @_; no strict "refs"; for my $super (@{(ref($self) || $self) ."\::ISA"}) { for my $ancestor (@{"$super\::ISA"}) { return &{"$ancestor\::$name"}($self, @args) if defined &{"$ancestor\::$name"}; } } die "Undefined method `$name'"; } package SubSub; sub call_super_foo { shift->dispatch_ancestor_method("foo") }