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 あたり
281 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 15:50:31 ] バッチファイル(hoge.bat)の1行目に PATH C:\hage;%PATH% と「挿入」したいんですけど、 ワンライナーでできますか? できるならやり方を教えてください。
282 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 16:00:35 ] open BAT '>hoge.bat'; print BAT 'PATH C:\hage;%PATH%';print BAT <BAT>; こんな感じ?
283 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 16:07:04 ] 愚直に perl -e "open my $FH,'<','hoge.bat';my @l=<$FH>;close $FH;open $FH,'>','hoge.bat';print $FH \"PATH C:\\hage;\%PATH\%\n\",@l;"
284 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 16:15:23 ] perl -p0i -e 's/^/PATH C:\\hage;%PATH%\n/' hoge.bat Windowsだとシングルクオートじゃなくてダブルクオートじゃないとだめなんだっけか でもこのままやると%PATH%が展開されちゃったりするのか?よくわからんから適当に直してくれ
285 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 17:13:28 ] >>284 できました!ありがとう。 perl -i.BAK -p0 -e "s/^/PATH C:\\hage;%%PATH%%\n/" hoge.bat
286 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 01:58:11 ] perlのスクリプトを含むWindowsのパッケージを setup.exe みたいな塊にまとめたいのですが 何がおすすめでしょうか? 昔単なる実行ファイルだけのときは innoSetup使ってたけど
287 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 07:21:30 ] PAL Perl2EXE
288 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:04:34 ] 関数の命名でヒントください 「array化」を英語で書くとしたら 「arraylize」「arrailise」「arrailize」、 どれにしたらよいでしょうか? テキストを読みこんで、それを配列に格納する というありふれた機能を持つ関数の名前です 下のように使っています my @list = arraylize ( "list.dat" ) ; sub arraylize { my $name = $_[0] ; open ( FH ,"< $name" ) ; my @listArray = <FH> ; close (FH) ; return @listArray ; } 他にも、もっと語呂のいい名前があったら教えてください それ以前に、同じような動作をするものがあったら知りたいです
289 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:16:00 ] いきなりファイル名でというのは知らないけど、強いて言えば IO::Handleのgetlinesが近いかなぁ。 本題とは関係ないが、せめてopenのエラー処理( or die $! をつける程度でいいよ)はやっとけ。後で苦労するぞ。
290 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:27:01 ] 「ファイルを読み込んで配列を返す」処理につける名前にしちゃ arraylize は筋が悪いな readfile なり readlines なりでいいだろ どうしても array が重要だっつーんなら make_array
291 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:30:10 ] まんまでいいなら、file2array
292 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:35:40 ] sub arraylize { my $name = shift ; open ( my $fh ,"<", $name ) ; my @listArray = <$fh> ; close ($fh) ; return @listArray ; } 関係ないけど
293 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 12:39:50 ] >「arraylize」「arrailise」「arrailize」 l はどっから出てきたんだよ
294 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 13:18:58 ] セパレータが指定されたら split した配列を返したり、 配列だったらそのまま返したり、 ハッシュだったら key/value をセパレータで繋げた配列を返したり・・・ そこまでやって、初めて arraylize を名乗っていい。 そう思うんだ。 どうでもいいけど
295 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 13:37:18 ] to_arrayじゃダメなん?
296 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 14:12:49 ] ありがとうございます 単純にfile2arrayにします エラー処理や ファイルハンドルに$fh、 そこのところ貰います
297 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 14:42:16 ] my %tmp; @tmp{qw(foo bar baz)} = split(/,/, $_, 3); push(@result, \%tmp); みたいなコードがあるんですが、これを %tmp を使わずに一行で済ます書き方ってあるでしょうか。 mapあたりでできそうなんだけど思いつかない… (foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。
298 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 14:51:29 ] >>288 わざわざ作らんで use File::Slurp; my @list = read_file("list.dat"); しなよ。
299 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 14:58:34 ] >>297 > (foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。 List::MoreUtilsになにかあるんじゃ
300 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 15:01:31 ] perl -e "print ((qw(foo bar baz),split(/,/, 'xxx,yyy,zzz'))[map{$_,$_+3}(0..2)]); fooxxxbaryyybazzzz あんまやるもんじゃないな
301 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 16:11:01 ] 頭がおかしくなりそうだ TMTOWTDIと言うけど、杉樽歯泳場猿画五都市と言う名言もあるし
302 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 16:17:03 ] >>297 use List::MoreUtils qw(zip); $_ = '1,2,3'; push @result, {zip @{[qw(foo bar baz)]}, @{[split /,/, $_, 3]}};
303 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 16:23:58 ] >>299 おお! と思って List::MoreUtils の pairwise や mesh が使えるかと思って試してみました。 が、一旦変数に入れないとARRAYとして解釈してくれずダメでした… #NG print mesh qw(foo bar baz), (split(/,/, "1,2,3")); # compilation errors #OK my @array1 = qw(foo bar baz); my @array2 = split(/,/, "1,2,3"); print mesh @array1, @array2;
304 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 16:25:12 ] >>302 入れ違いになりました。 素晴らしい。使わせていただきます。ありがとうございます。
305 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 16:35:48 ] >>297 >(foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。 変数一つ作っていいならこんな関数かな my @arr = ('foo', 'bar', 'baz', 1, 2, 3); my $half = $#arr / 2; my @result = map { +($arr[$_], $arr[$_ + $half + 1]) } (0 .. $half);
306 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:07:39 ] >>302 いったん無名配列への参照[]にして それを@{}で、参照先の配列に戻して渡している という理解でいいのかな?
307 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:10:34 ] >>306 そだね ttp://perl-users.jp/articles/advent-calendar/2008/14.html
308 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:12:08 ] >>305 なんで3行で済ます方法を書いたの?
309 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:14:06 ] >>308 二行だろ
310 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:18:09 ] >>308 何揚げ足とろうとしてんのw
311 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:32:43 ] perl -e "print join',', map{(qw(foo bar baz))[$_],(split /,/, 'xxx,yyy,zzz')[$_]}(0..999);#十分に大きい値 foo,xxx,bar,yyy,baz,zzz >>300 よりはマシかなあ…
312 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 17:51:55 ] >>305 sub zip{ map { $_, shift @{$_[1]} } @{$_[0]} } print zip [1,2,3],[4,5,6] ;
313 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 18:02:25 ] perl -e '@array = qw/xxx yyy zzz 1 2 3/; print map { $array[$_] => $array[$_ + @array / 2] } (0..($#array / 2));'
314 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 21:28:38 ] >>293 ヒント:シノラー
315 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 22:52:02 ] TwitterのAPI叩くにはどうすればいいですか Net::Twitterとかじゃなくて、純粋にHTTP使ってその辺から学習したいのです
316 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 23:18:20 ] usy.jp/twitter/index.php?Twitter%20API#ga975f17 サンプル集
317 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 23:51:12 ] use Net::Twitter; 役にたたなかった
318 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 19:37:45 ] win32でパスを含めて 256 バイト以上のファイル www.namazu.org/ml/namazu-win32-users-ja/msg01951.html この問題ってもう解決されています?
319 名前:デフォルトの名無しさん [2010/05/11(火) 00:00:10 ] Perlのファイル読み込みと配列格納について質問があります。 エクセルから出力した行列状態になっているcvsファイルをPerlに読み込ませて、 @a、@b、@cにそれぞれの行のデータを格納したいです。 なので、二次元配列のようなことをしないといけないと思うのですが、 Perlで二次元配列のような処理をするにはどうすればよいのでしょうか? また行列状態になっているファイルを配列に格納する他の良い方法はありますでしょうか? よろしくお願いします。
320 名前:319 [2010/05/11(火) 00:14:07 ] 追記です。このような内容のファイルを扱っています。 1 Takehara Shinji 500 600 1300 2 Hatakeyama Takanori 569 795 1560 3 Kouki Kameda 785 889 2695 4 Daiki Kameda 758 784 9000 5 Tomoki Kameda 580 120 984 そして、左から4行目〜6行目にある数値を縦に、 @a、@b、@cに格納し、 $a[0] を参照すると、500 $a[1] を参照すると、569 $b[0] を参照すると、600 $b[1] を参照すると、795 $c[0] を参照すると、1300 $c[1] を参照すると、1560 といった具合にしたいです。
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 ] なんで?