1 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 16:47:06 ] "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 ● 2010/02/19 現在の最新版: 5.10.1 ▼ 前スレ Perlについての質問箱 42箱目 pc12.2ch.net/test/read.cgi/tech/1257139591/ リンク集は >>2-3 Perl 日本語処理の基礎の基礎 >>4 過去スレは >>5-7 あたり
321 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 00:16:24 ] >>319 ・「perl 配列の配列」でググる ・「perl CSV」でググる
322 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 00:40:12 ] >>320 1 #! /usr/bin/perl 2 3 use strict; 4 5 my(@data, @array); 6 @data = ( 7 '1 Takehara Shinji 500 600 1300', 8 '2 Hatakeyama Takanori 569 795 1560', 9 '3 Kouki Kameda 785 889 2695', 10 '4 Daiki Kameda 758 784 9000', 11 '5 Tomoki Kameda 580 120 984', 12 ); 13 14 foreach(@data){ 15 push(@array, [@{[split(/\s+/, $_)]}[3..5]]); 16 } 17 18 local $\ = "\n"; 19 20 print $array[0][0]; #=> 500 21 print $array[1][0]; #=> 569 22 print $array[0][1]; #=> 600 23 print $array[1][1]; #=> 795 24 print $array[0][2]; #=> 1300 25 print $array[1][2]; #=> 1560
323 名前:デフォルトの名無しさん [2010/05/11(火) 01:17:33 ] >>322 ありがとうございます。 外部からファイルを読み込む場合はどうすればよいのでしょうか?
324 名前:321 mailto:sage [2010/05/11(火) 01:45:17 ] >>323 だから「perl CSV」でググれと教えたのに。ググれば ”csvファイルを読み込んで配列の配列に変換に変換する” ttp://d.hatena.ne.jp/perlcodesample/20080728/1217336230 こんくらいすぐに出てくるだろ
325 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 01:51:03 ] >>322 を改良できんレベルの人なら>>324 のリンク先飛んでもイミフだろ
326 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 01:53:57 ] >>323 use IO::File; my @data = IO::File->new('data.txt', 'r')->getlines; chomp @data;
327 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:04:22 ] use File::Slurp; my @csv = read_file('hoge.csv'); chomp @csv;
328 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:19:44 ] >>322 [@{[split(/\s+/, $_)]}[3..5]] は [(split /\s+/, $_)[3..5]] のほうがいいよね。この場合に限れば /\s+/, $_ が無くてもよし。 つーかCSVなら最初からText::CSV(_XS)?使えばいいじゃんって話だけど。
329 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 02:46:24 ] >>328 おお、/\s/まで省略できるのか 初めて知った ありがt
330 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 03:42:18 ] $_ = " foo\nbar\tbaz" としたとき、 split(/\s+/) だと ('', 'foo', 'bar', 'baz') が返るけど、 引数なしのsplit または split(" ") なら ('foo', 'bar', 'baz') になるってことだけ注意な。
331 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 01:12:21 ] HTTP通信するにはなんていうライブラリつかえばいいの
332 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 02:31:39 ] socks
333 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 13:31:19 ] えっ?
334 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 13:35:41 ] LWP
335 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 15:27:05 ] コードポイントからその文字を出力したいです。 #!/usr/bin/perl use strict; use utf8; use Encode; use Encode::Guess; my $cp = "4FAE"; # 「侮」のコードポイント my $packed = pack("S", $cp); my $decoded = decode("utf-16be", $packed); print $decoded, "\n"; my $decoded = decode("utf-16le", $packed); print $decoded, "\n"; できないです。
336 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 15:58:56 ] pack("U", 0x4FAE) じゃだめなのか
337 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 16:16:02 ] 0x4FAE または hex("4FAE") または "20398"
338 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 16:22:45 ] #!/usr/bin/perl use strict; use utf8; use Encode; use Encode::Guess; my $cp = "4FAE"; # 「侮」のコードポイント my $packed = pack("U", hex($cp)); print $packed, "\n"; ありがとうできました。でもwarningがでます。 $ perl cptest2.pl Wide character in print at cptest2.pl line 9. 侮 $
339 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 16:28:58 ] 16進文字列からバイト列への変換が間違ってるな。 pack("S", $cp)じゃなくてpack("H*", $cp)だろ。
340 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 16:32:44 ] >>338 wide characterをいきなりprintするとそうなる。 encodeしてバイト文字列にしてからprintするか、 printする前に文字コード指定してレイヤつけとけ。 binmode STDOUT, ':encoding(utf-8)';
341 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 16:34:59 ] binmodeつけたら直りました。 ありがとうです。
342 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 12:34:03 ] www.cgarbs.de/japana.en.html これをwindowsで動かせた人いますか? perlのファイル1つだけのプログラムだからlinuxで動かすのは簡単だったんだけど windowsではうまく動いてくれない
343 名前:デフォルトの名無しさん [2010/05/14(金) 13:21:02 ] 文字のバイトコードを得るほうほうを教えてください! たとえば、a から 97 を得るようなことってできますか??
344 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 13:23:28 ] ord("a")
345 名前:デフォルトの名無しさん [2010/05/14(金) 13:26:10 ] ありがとう!
346 名前:デフォルトの名無しさん [2010/05/15(土) 03:08:54 ] perlで文字をprint等で出力するとき、特定の行で改行をして出力するというようなことってできますか?
347 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 03:32:34 ] できるよ安心して
348 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 03:44:17 ] >>347 安心した やり方を教えてちょ
349 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 04:42:20 ] 何だよ「特定の行」って
350 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 06:11:15 ] 質問の意図するところが分からない。このうちのどれか? use strict; use warnings; print "is\nthis\nunko?\n"; use strict; use warnings; print << "END_OF_UNKO"; this is unko! END_OF_UNKO use strict; use warnings; use HTML::Template; my $what_is_this = join "", <DATA>; my $t = HTML::Template->new( scalarref => \$what_is_this ); $t->param('var', "was"); print $t->output; __DATA__ this <TMPL_VAR name="var"> unko!
351 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 06:50:15 ] >>348 use IO::File; my $fh = IO::File->new('hoge.txt', 'r'); while(my $line = $fh->getline){ print $line; print "\n" if $line =~ /hoge/; } こんな漢字?
352 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 09:22:29 ] $. == 行番号 とか。
353 名前:デフォルトの名無しさん [2010/05/15(土) 11:21:19 ] perlで作った掲示板の連続投稿を制限する方法を教えてください。 一定時間が経過するまで再投稿できないようにしたいです。
354 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 11:59:34 ] 投稿者のIDに対して最後の投稿時間を記録する
355 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 12:24:13 ] 小規模ならグローバルでもいいんじゃないの? # 30秒経過してない場合returnする return if $g_last_post + 30 > time; $g_last_post = time;
356 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 14:35:57 ] >>353 IPのログはとってんだろ? そこから判定すりゃいい samba24みたいな手にするって方法もあるな ちょっと技術がいるかも知れないが
357 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 14:55:21 ] 普通はそんなめんどいことしないでクッキー食わせて判定だと思うぜ
358 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 15:04:37 ] ログは巨大だからなあ 自前でテーブル持つ方が軽い
359 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 15:21:54 ] いやだから普通はクッキーだろっての
360 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 15:55:01 ] ↑バカは喋るな
361 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 15:58:24 ] >>359 クライアントが書き込み後にクッキー捨てたらアウトだと思うんだがそうでもないのか もうちょっと詳しく
362 名前:デフォルトの名無しさん [2010/05/15(土) 16:01:51 ] >>349-352 長いテキストがあり、100文字目ごとに改行を入れるということです。 分かりにくくて申し訳ありませんでした。
363 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 16:17:33 ] 2chもクッキーだな
364 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 16:27:54 ] >>362 Text::LineFold >>353 ,354-359,361,363 板違い pc11.2ch.net/php/
365 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 16:29:03 ] 一足遅かったか >>362 >>3 www.din.or.jp/~ohzaki/perl.htm#JP_Fold search.cpan.org/search?m=all&q=fold&n=100 >>353 △▲ WebProg 初心者の質問 Part22 ▼▽ pc11.2ch.net/test/read.cgi/php/1272872528/
366 名前:デフォルトの名無しさん [2010/05/16(日) 21:25:10 ] funcA(); if(hoge){ funcAErr(); } else { funcB(); if(fuga){ funcBErr(); } else { funcC(); if(fuga){ resultA(); } else{ resultB(); } } } こんな感じで事前処理にこけたら弾き、を繰り返して最後の処理で結果Aか結果Bのいずれかを返す、 と言ったコードがあるんですが、これをもっとPerlらしくシンプルに書きたいんだがどう書けばいいだろう……。 (ifネストが実際には3階層ではなく20階層くらいあります)
367 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 21:43:55 ] >>366 funcA() や funcB() の戻り値は無いのかとか、hoge や fuga が何を判定してるのかとか、 funcAErr() でなく funcErr('A') じゃダメなのかとか、エラー処理後に戻ってくる (if then else で括る) 必要があるのかとか、Perlらしさ以前の問題だと思う。
368 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 21:45:08 ] こんな感じの改造すれば良いんちゃう? my @tasks = ( sub { () }, # <= funcA() とかが入る。 sub { () }, sub { () }, sub { () }, sub { () }, sub { () }, sub { 42 } ); my $argument ; for ( @tasks ){ my $flag = $_->( $argument ) ; next if ! $flag ; # エラー処理やりたきゃ、ここを真面に。 print qq{${flag}hoge\n} ; last ; }
369 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 22:25:07 ] >>366 エラー処理はfuncA()、funcB()の中で例外発生させて 全体をevalブロックでくくり、例外をキャッチして処理 エラー以外の分岐は適当に処理をブロックでくくり、last、redoなどでコントロール eval { funcA(); funcB(); { funcC(); if (fuga) { resultA(); last } resultB(); } }; if ($err = $@) { $err->A ? funcAErr() : $err->B ? funcBErr() : $err->C ? funcCErr() : Err(); }
370 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 22:49:10 ] メールを受信して、添付の画像ファイルを画像処理し、サーバに保存したいと考えています。 メール受信時に本プログラムにメールを渡すようにメールサーバは設定しています。 以下ソースの関係している部分です。 ----mailimage.pl----- my $parser = MIME::Parser->new; #ファイルの一時保存場所を指定 $parser->output_dir('./tmp'); $filename=''; #標準入力からメールを取得 my $entity = $parser->parse(*STDIN); #添付ファイルがある場合のみ処理 if($entity->is_multipart){ #パートの数(本文と添付ファイルの合計数) $count = $entity->parts; #メール本文以外(添付のみ)を取り出し(本文は0番目のため、一番目から取り出し) for($i = 1; $i < $count; $i++){ #ファイル名を含むパスを取り出し $path = $entity->parts($i)->bodyhandle->path; #ファイル名を取り出し $filename =time. (fileparse($path))[0]; $filenameglobal=$filename; `./out1 $path outputimg/$filename.bmp`; } } out1というプログラムが画像処理を行うファイルで、第一引数に入力を、第2引数に出力先をとるように作成しています。 mailimage.pl < sample.eml といった具合に、ローカル環境でeメールファイルを渡してやった場合は正常に動作します。 しかし、実際にメールを受信するとtmpファイルへの保存は行われるのですがout1で得られるべき出力画像が得られません。 どうやら、tmpフォルダに保存される前にout1を呼び出しているようで、入力がない状態になってしまっているようです。 解決策のご提示をよろしくお願いいたします。 また、一度ファイルに保存することなく直接メモリ上で受け渡す方法などもご提示いただけると幸いです。
371 名前:デフォルトの名無しさん [2010/05/17(月) 01:35:34 ] perl から任意のアプリ(例えばメモ帳)を起動したいんだけどどう書けば良いのでしょうか?
372 名前:デフォルトの名無しさん mailto:sage [2010/05/17(月) 01:49:44 ] perl -e "`notepad`
373 名前:デフォルトの名無しさん [2010/05/17(月) 22:55:18 ] cpan> install XML::Atom *********いろいろ展開されて Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- Warning: No success on command[C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site] MIYAGAWA/XML-Atom-0.37.tar.gz C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site -- NOT OK Running make test Make had some problems, won't test Running make install Make had some problems, won't install Failed during this command: MIYAGAWA/XML-Atom-0.37.tar.gz : writemakefile NO 'C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site' ret urned status 512 cpan> と表示されてしまいました。とりあえず、nmake.exe はダウンロードしました。 これからどうすればいいでしょうか?
374 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 00:12:07 ] >>373 今使ってるperlをアンインストールしてActivePerlの最新版をインストールし、PPMを使え
375 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 00:23:08 ] うちcpanが成功した試しがないわ ppmならokだけど
376 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 05:28:00 ] XS系はことごとく失敗する気がする… 特にXMLやHTMLのパーサー関連は入らん at Ubuntu
377 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 06:13:44 ] まさかbuild-essential入れてないとかじゃないよな
378 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 06:45:12 ] XML-Atomはppmに無いからめんどくさいんだよな だから俺は使ってない あとこいつマルチだな
379 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 08:46:53 ] 今ならStrawberry Perl入れた方が楽じゃない? XML::Atomもすんなり入ったよ
380 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 08:55:06 ] そもそもwindows系OSでperl使うのがすでに茨の道とも言える
381 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 10:03:01 ] なんで?
382 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 11:48:53 ] >>378 リポジトリにこれ加えとけ。 trouchelle.com/ppm10/package.xml
383 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 12:20:10 ] elseifでなく何故elsifなんですか?
384 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 13:26:56 ] 母音が続くのが気持ち悪いから elifじゃないのと聞かれたら解答に窮するが、CPPはelifなんだよな 文化によって多少違いはあるが、やはり、母音が続くのが気持ち悪いんだと思う
385 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 13:55:38 ] いっそのことelfでいいじゃん。 短いし。
386 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 15:33:01 ] 最近プログラミングの勉強を始めました print "hello world"; と書いてhello.plで保存し、ターミナルで perl hello.pl と入力するのはわかったんですが、hello.plはどこに保存すればいいのですか? 環境はMac OS Xです
387 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:10:27 ] >>386 好きな場所
388 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:28:15 ] >>386 今自分がいる場所におけばいい 違う場所に置きたいならフルパスで指定すれば実行できる
389 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:41:23 ] >>382 サンクス つか、ppmguiにリポジトリのサジェストなんてあったんだな そこにも載ってたわ 重ねてサンクス
390 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 17:56:24 ] >>386 perlの前にターミナルの使い方を覚えるためのBash入門を読んだ方が良いかも。
391 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 18:42:40 ] それは的外れなアドバイス
392 名前:373 mailto:sage [2010/05/18(火) 21:37:27 ] ATOM::XML をWinXP/Active Perl に入れたい なにかヒントありますか? >>374 >>375 >>379 ストロベリー入れましたけど、Activeパールと同じエラーです。 (nmake をダウンロードして、ダウンしたパッケージをmake して、 それから、再度ACTIVE Perl で,ATOM::XMLしたときとです。 やはり、パッケージが問題なのかな? cpan> install ATOM::XML Fetching with LWP: cpan.strawberryperl.com/authors/01ma Fetching with LWP: cpan.strawberryperl.com/modules/02pa Fetching with LWP: cpan.strawberryperl.com/modules/03mo Creating database file ... Gathering information from index files ... Populating database tables ... Done! Warning: Cannot install ATOM::XML, don't kn Try the command i /ATOM::XML/ to find objects with matching identifiers.
393 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:44:02 ] 現在 WinXP上にActivePerlが入っています。StrawberrryPerlを入れて共存できるのでしょうか?
394 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:49:59 ] エラーメッセージくらい読めよ
395 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:52:02 ] 普通に考えるとパッケージ名ってAtom::XMLもしくはXML::Atomだからでは
396 名前:373 mailto:sage [2010/05/18(火) 21:57:06 ] とりあえず、 install XML::Atom::Feed とすると、したみたいになった。これってATOM::XML ってインストールできたのかな Prepending C:\strawberry\cpan\build\XML-Atom-0.37-H4btN8/blib/arch C:\strawberry \cpan\build\XML-Atom-0.37-H4btN8/blib/lib to PERL5LIB for 'install' Installing C:\strawberry\perl\site\lib\XML\Atom.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Base.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Category.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Client.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Content.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Entry.pm Installing C:\strawberry\perl\site\lib\XML\Atom\ErrorHandler.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Feed.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Link.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Person.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Server.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Thing.pm Installing C:\strawberry\perl\site\lib\XML\Atom\Util.pm Appending installation info to C:\strawberry\perl\lib/perllocal.pod MIYAGAWA/XML-Atom-0.37.tar.gz C:\strawberry\c\bin\dmake.EXE install UNINST=1 -- OK cpan>
397 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 22:13:16 ] perlで添付ファイル取得して、それをopencvに渡して結果を保存したいんだが、出来ない。 ローカルでemlファイル読み込ませるといけるのに、メール受信をトリガに起動するとだめだ・・。 どうして?
398 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 22:32:58 ] >>396 OKってかいてありますやん 心配なら $ perldoc XML::Atom
399 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 22:34:23 ] >>396 XML::Atom と ATOM::XML は全く別のモジュールだ。 (存在すればの話しだが) お前さんが、いくら XML::Atom を入れたとしても、 ATOM::XML は永久に入らん。 気持悪いったらありゃしない。
400 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 12:22:56 ] アハハハ
401 名前:デフォルトの名無しさん [2010/05/19(水) 14:46:33 ] たとえば、[[:ascii:]]から'<'を除いた文字クラスを表わすにはどうしたらいいでしょうか?
402 名前:デフォルトの名無しさん mailto:sage [2010/05/19(水) 18:51:09 ] もともと入ってないやん
403 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 21:53:00 ] 数百のファイルを処理するPerlスクリプトがありまして、それがシーケンシャルに処理してて クソ時間がかかるため、マルチスレッドでやらせようとPerlについて勉強しています。 で、いまんとこ、セマフォで並列処理数を制御し、joinするためだけのスレッドを動かして かたっぱしからjoinするようにしています。おかげで処理時間は半分以下になったのですが、 これを添削していただけないでしょうか。もっとエレガントなやり方があれば教えていただきたいです。 よろしくおねがいします。 #!/usr/bin/perl use strict; use File::Basename; use File::Path; use threads; use threads::shared; use Thread::Semaphore; use Codemap; use SVG; my $concurrency = 5; my $semaphore = Thread::Semaphore->new($concurrency); my $exitflag :shared = 0; my $jointhreads = threads->new(\&joinThreads); while (@ARGV) { my $orig_svg = shift(@ARGV); $semaphore->down; threads->new(\&doSplit, $semaphore, $orig_svg); } $exitflag = 1; $jointhreads->join; exit 0;
404 名前:403のつづき mailto:sage [2010/05/21(金) 21:53:56 ] sub joinThreads { until ($exitflag) { foreach my $thr (threads->list) { if ($thr->tid and !threads::equal($thr, threads->self)) { $thr->join; } } print "\nThreads joined.\n"; } } sub doSplit { my $semaphore = shift; my $orig_svg = shift; my $svg = new SVG($orig_svg); $svg->setdumpdir("work.d"); if ($svg->modtime() > $svg->splittime()) { $svg->dump(); print STDERR " $svg->{filename} : splitted\n" } else { print STDERR " $svg->{filename} : SKIP\n" } $semaphore->up; }
405 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 14:07:11 ] UTF8の〜をshift_jis(cp932)に変換して出力するとエラーが出てしまいます。 解決策があれば教えていただきたいです。 環境はWindows 7 64bitとActivePerl v5.10.1 64bitです。 use utf8; binmode STDOUT, ":encoding(cp932)"; print "昨日は10時〜6時まで寝た。\n"; D:\>test.pl "\x{301c}" does not map to cp932 at D:\test.pl line 3. 昨日は10時\x{301c}6時まで寝た。
406 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 14:20:39 ] D:\>test.pl 何故こんなところで作業しているのか
407 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 14:54:09 ] 「〜」には FULLWIDTH TILDE (FF5E) WAVE DASH (301C) の二種類がある。
408 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 14:57:40 ] 〜の厄介さはMacを使ってるとよく分かる
409 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:10:32 ] macでなくても〜は厄介
410 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:13:53 ] Macだとプログラムとか使わなくても 普段から〜が厄介になる
411 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:15:49 ] え? 俺は生粋のマカーだけど、厄介さが全然分からん。 何かトラブるっけ? "〜"って。 Mac<=>Winのデータ交換とかの話し?
412 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:21:41 ] Macで〜と書き込んだら Winだと逆向きの波線に見えたり 最近は大丈夫な気はするが
413 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:31:53 ] 〜が厄介なんて、OS9時代の話だろ。 昔から機種依存文字問題とか、今はUTF8-macとUTF-8とか もっと厄介なモンがあるから。
414 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:54:16 ] OSXでの話だが
415 名前:405 mailto:sage [2010/05/22(土) 17:06:03 ] 皆さんレスありがとうございます。 >>405 はmeadowから打ち込んだ〜は\x{301c}となり、 notepad等から打ち込んだ〜は\x{ff5e}になる事が原因で表示に失敗していました。 \x{301c}はshift_jisでは表示に成功しcp932では失敗しました。 \x{ff5e}はcp932では表示に成功しshift_jisでは失敗しました。 どうやらeucとsjisの〜はutf8の\x{301c}に対応していて cp932の〜はutf8の\x{ff5e}に対応しているようでした。 なので例えばeucの〜をutf8に変換し、それをcp932に変換すると失敗するようです。 挙動がおかしいと思った元のプログラムではネット上にあるeucのページを取ってきて utf8に変換し出力時にcp932に変換していたので上記の理由で文字化けしていた様です。 そこでeucをutf8に変換した際に\x{301c}を\x{ff5e}に変換するようにしました。 $utf8data =~ tr/\x{301c}/\x{ff5e}/; そうしたところprintした際に"\x{301c}" does not map to cp932というエラーも出ず、無事〜が表示されるようになりました。
416 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 17:10:30 ] 意味不明
417 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 19:23:59 ] >>405 use utf8は「フツーは使うな」とCPANに書いてあった気がする。 Windowsを呪いながらEncode使え。 #!perl use Encode; my $msg = "昨日は10時〜6時まで寝た。\n"; Encode::from_to($msg, 'utf8', 'cp932'); print $msg;
418 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 19:39:43 ] >use utf8は「フツーは使うな」 理由は?
419 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 20:34:20 ] >>417 >use utf8は「フツーは使うな」とCPANに書いてあった気がする。 どこに書いてあったの?聞いたことない
420 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 21:01:51 ] > Do not use this pragma for anything else than telling Perl that your script is written in UTF-8. もしかしてこれの事か?
421 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 21:08:00 ] >>417 そのEncodeの作者が >スクリプトはUTF-8で書き、use utf8;するのがモダンPerlのあり方です。 って言ってるけどな。 ttp://blog.livedoor.jp/dankogai/archives/51221731.html