• 締切済み

POE

動的に対象のファイルを変えたいのですが。。。 while(1){ &test($file); } sub test { POE::Session->create( inline_states => { _start => \\&setup, handler_input => \\&handler_input, _stop => \\&handler_stop, }, args => [ $file ], ); POE::Kernel->run; exit; } sub setup{ my ( $heap, $target_file_path_now ) = @_[HEAP, ARG0]; $heap->{tail_wheel} = POE::Wheel::FollowTail->new( Filename => $ile, InputEvent => \'handler_input\', ); return; } sub handler_input{ my $record = $_[ARG0]; print $record,\"\\n\";} } $th->join;

  • Perl
  • 回答数1
  • ありがとう数1

みんなの回答

回答No.1

handler_inputサブルーチンの中で、  $_[HEAP]->{tail_wheel} = POE::Wheel::FollowTail->new(   Filename => $_[ARG0],   InputEvent => 'handler_input',  ); とすれば、FollowTailが拾ってきた文字列に応じて、読み込み対象のファイルを変更できるはずです。 (ネストを表現するため、上記ソースには全角スペースが入っています。) ここから以下、蛇足。 グローバル変数$fileは、my宣言したほうが良いです。 あと、testサブルーチンの最後でexitしてますので、この場合whileは意味をなさないですね。 それから、POE::Kernel->_stopが叩かれない限り、その先へは進みませんので、やはりwhileループ自体不要です。直接mainで&test($file)として問題ないです。 # つい、気になったので。失礼しました。

関連するQ&A

  • perlでサブルーチンへの複数の配列渡し

    perlでサブルーチンに配列を渡しているのですが、 引数としている配列が1個の場合は問題ないのですが、 複数渡すと、第2引数以降が渡りません。 どの様にすれば上手くできますか。 例1 #!/usr/bin/perl @x1 = (14, 11, 5, 12, 8, 15); @x2 = (12, 10, 8, 9); print "main : @x1 \n"; &test(@x1); sub test { my (@arg1) = @_; print "sub : @arg1 \n"; } 結果 main : 14 11 5 12 8 15 sub : 14 11 5 12 8 15 例2 #!/usr/bin/perl @x1 = (14, 11, 5, 12, 8, 15); @x2 = (12, 10, 8, 9); print "main : @x1 \n"; print "main : @x2 \n"; &test(@x1, @x2); sub test { my (@arg1, @arg2) = @_; print "sub : @arg1 \n"; print "sub : @arg2 \n"; } 結果 main : 14 11 5 12 8 15 main : 12 10 8 9 sub : 14 11 5 12 8 15 12 10 8 9 sub : 引数1に全てが設定されて、引数2に設定されていない。

    • ベストアンサー
    • Perl
  • テキストファイルの入力について教えてください。

    可変長レコードのテキストファイルを1レコードずつ読み込んで処理をしたいと思っています。 改行コードで区切られているので、line inputで読み込もうとしていますがうまくいきません。 テスト用に入力ファイルを小さくするとうまくいくのですが、目的のファイル(180MB)を読み込もうとするとフリーズしたような状態になってしまいます。 どうすればよいかお知恵を拝借できないでしょうか。 EXCEL2003 VBAです。 よろしくお願いいたします。

  • IO-Socketで…

    最初に開かれた1つのソケットで、 サーバーから不定期に送られてくるデータを処理→表示しつつ、 ユーザーから入力があった場合にそのソケットへ送信するといったメッセンジャーを作ろうと思っているのですが、「入力待ちと受信待ちを同時に進める」という事がどうも上手くいってくれません… use threads;を使い、送信用・受信用と分けたのですが、やはりどちらか一方が止まってしまいます…。 どの様に書いたらよいのでしょうか… 何方かご教授下さい…。 use threads; use IO::Socket; ($test_socketを生成) sub send{ while($input = <STDIN>){ chomp($input); print $test_socket "$input"; } sub recv{ while(1){ if($receive = <$test_socket>){ print "$receive\n"; } } } my $sendthread = threads->new(\&send); $sendthread->join(); my $recvthread = threads->new(\&recv); $recvthread->join();

  • perl言語のプログラム不良

    あらかじめ作った英語のテキストファイルを入力し、 文字数をカウントするプログラム(perl言語)でつくっています。 あらかたできたと思うのですが、 明らかに100文字以上あるにも関わらず なぜか3文字とカウントされます。 どこが不具合がわかる方いましたら よろしくお願いいたします。 以下が問題のプログラムです。 print"読み込むファイル名を入力してください。\n"; $input_file = <STDIN>; open(INPUT, "$input_file") or die "$!"; sub count_words{ my @ words = split(/\W+/,$_[0]); my $num_words=@ words; } $num_words = &count_words($input_file); print"単語数は$num_wordsです。"; close(INPUT);

  • HTMLのテキストボックスへのドラッグ&ドロップについて

    HTMLのテキストボックスに文字列(テキスト)をドラッグ&ドロップしたときに、イベントを発生させたいのですが分かりません。 <INPUT TYPE="text" NAME="test" VALUE="" ondragdrop="alert('test!')"> というのを作ってみましたが、ondragdropはファイルにしか対応していないみたいなので無理でした。 ondragoverは反応しましたが、マウスを離す前にイベントが発生するため、こちらの意図する動作にはなりません。 やはりそういうイベントハンドラは用意されていないのでしょうか?

  • EXCEL フォルダだけを検索したい

    EXCEL2003を使っています。 開いているファイルと同じフォルダ内に「テストフォルダ」があるかどうかを調べ、存在した場合に削除したいのですが、以下のような書き方ではフォルダだけでなくファイルも検索してしまうようです。 フォルダだけを検索するにはどうしたらいいでしょうか? FSOでできることは分かっていますが、以下の方法で試してみたいのです。どうぞ宜しくお願い致します。 Sub test() my_path = ActiveWorkbook.Path & "\" f_name = Dir(my_path, 16) Do Until f_name = "" If f_name = "テストフォルダ" Then RmDir "テストフォルダ" End If f_name = Dir() Loop End Sub

  • DBのWHERE~ANDの使い分けをphpで処理

    <input type="text" name="aaaaa" value=""> <input type="text" name="bbbbb" value=""> <input type="text" name="ccccc" value=""> このinputは全部で30個あります。DBには30個のカラムがあって、 対象のカラムと比較する値valueが""のときはWHERE以降をやらないで、 1つ以上のときはWHERE句をやってANDで繋げて絞り込んでいきたいです。 $_GETのキー名とその対象のカラム名は別々につけています。 $_GETの値は文字列や数字が入ります。 <?php mb_http_output('UTF-8');/*ajaxの読み込みにつかうファイルのため*/ mb_internal_encoding('UTF-8');/*ajaxの読み込みにつかうファイルのため*/ if(isset($aaaaa) && strlen($aaaaa)>0){ $aaaaa = mb_convert_encoding($_GET['aaaaa'], "UTF-8"); htmlentities($aaaaa, ENT_QUOTES); $test1["id"] = $aaaaa; } if(isset($bbbbb) && strlen($bbbbb)>0){ $bbbbb = mb_convert_encoding($_GET['bbbbb'], "UTF-8"); htmlentities($bbbbb, ENT_QUOTES); $test1["name"] = $bbbbb; } if(isset($ccccc) && strlen($ccccc)>0){ $ccccc = mb_convert_encoding($_GET['ccccc'], "UTF-8"); htmlentities($ccccc, ENT_QUOTES); $test1["textdata"] = $ccccc; } /*あと27個つづきます*/ mysql_set_charset('utf8'); $my_1 = "SELECT * FROM tablename"; if(isset($test1) && !$test1==null){ foreach($test1 as $key => $value){$test2 = $key;} $my_1 .= " WHERE "; while($test1--){ $my_1 .= $test2."=".$test1[$test2]." AND "; if($test1==0){$my_1 .= $test2."=".$test1[$test2];} } $my_1_q = mysql_query($my_1,$mysql); } /*$my_1を他のとこでも使いたい*/ $my_2 = $my_1." ORDER BY id LIMIT 0,10"; $my_2_q = mysql_query($my_2,$mysql); $my_3 = "SELECT COUNT(*) AS ccc FROM tablename WHERE name='$aaaaa' AND bbbbb='$bbbbb'"; $my_3_q = mysql_query($my_3,$mysql); if(!$my_1_q && !my_2_q && !$my_3_q){die(mysql_error());} こんなかんじでやったのですが、クエリの作成でエラーになってしまいます。 できれば最初のifがいっぱい続くのももっと上手にできるようにしたいです。

    • ベストアンサー
    • PHP
  • jquery複数のcheckboxの値について

    どうも、はじめまして、jqueryに興味をもった初心者です。 jqueryを利用で、phpファイルにcheckboxの値を渡し、loadでphpファイルを読み込みたいのですが、うまくいきません。。ご存知の方いましたら、 お手数ですが、教えてください。。 環境、php5.1,jquery1.4, ソース <!--html側--> <html> <head> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="chk.js"></script> <title></title></head> <body> <input type="checkbox" name="test[]" id="test" value="1">test1 <input type="checkbox" name="test[]" id="test" value="2">test2 <input type="checkbox" name="test[]" id="test" value="3">test3 <input type="checkbox" name="test[]" id="test" value="4">test4 <input type="submit" value="sub" id="sub"> <div id="hbox">ここにロードしたい</div> </body> </html> //chk.js --------------------------- $(function(){ $("#sub").click(function () { var chk = $(".@test:checkbo[name^='test[]']:checked") .val(); $("#hbox").load("form.php",{test:chk}); }); }); //form.php ---------------------------- <?php echo htmlentities( print_r($_GET, true) ); ?> 以上がソースです。。。このソースだと、 checkを入れた値1つしか、phpに渡すことができません。。 checkを入れた値をすべて、phpに渡し、loadしたいのですが、 方法が分からず困ってます。 ご存知の方いましたら、お手数ですが、 分かりやすく、教えていただけませんでしょうか お願いいたします。

  • 「UNCパスはサポートされません」の回避方法

    VBSを作成していますが、下記のようにエラーとなります。 このVBSファイルは、ネットワークファイルサーバー上に置き、実行しています。 自分のパソコンのディスク内にVBSファイルを置き、実行すると、エラーにはなりません。 サーバー上にファイルを置く理由は、社内のどのパソコンからでも実行出来るようにしたいからです。 ネットワークのフォルダを「P」ドライブへ割り当てています。 しかし、\\Comdoc\work\My Documents\SETUP\win2000とサーバー名称を指定しても同じエラーが返されます。 「UNCパスはサポートされません」とありますが、どのように書き直したら良いのかその方法がありましたら教えてください。 Windows2000です。 --エラー内容-- 現在のディレクトリのパスとして '\\Comdoc\work\My Documents\SETUP\win2000' で CMD.EXE を開始しました。UNC パスはサポートされません。Windows ディレクトリを使用します。 --プログラム内容-- Dim WSH Set WSH = WScript.CreateObject("WScript.Shell") prnad prnabat Sub prnad() exeStr = "regsvr32 /s C:\setup\netmgmt\prnadmin.dll" set oExec = WSH.exec(exeStr) Do While oExec.Status = 0 WScript.Sleep 100 Loop End Sub Sub prnabat() spath = """P:\My Documents\SETUP\win2000""" WSH.Run "cmd /k spath & addprn.bat" End Sub

  • プロトタイプ宣言のワーニングについて

    関数のプロトタイプ宣言と、それに関するwarningsプラグマについてお教えください。 関数のプロトタイプ宣言は、その関数を呼び出す側がコンパイルされる時点で、すでに存在する必要があり、また、use warningsによってプラグマを有効にしておくと、遅いプロトタイプ宣言について警告してくれると理解していました。 以下の2例は、どちらもプロトタイプ宣言が遅いために、うまくプロトタイプが働かない例です。 しかし、(例1)ではwarningが表示されるのに対し、(例2)では表示されません。 どこか私の理解が誤っているのかと思うのですが、このようになる理由についてご教授いただきたく、よろしくお願いいたします。 ■ (例1) #!/usr/bin/env perl # -*- mode: cperl; coding:utf-8 -*- use strict; use warnings; my @a= 1..4; mypush( @a, 5..8); print join( ",", @_), "\n"; sub mypush(@@){ if( @_== 2){ print "ok.\n"; }else{ print "Prototypes does not work, arg. num=", 0+ @_, "\n"; } } □(出力1) main::mypush() called too early to check prototype at ./chk_prototype.pl line 10. Prototypes does not work, arg. num=8 ■(例2) #!/usr/bin/env perl # -*- mode: cperl; coding:utf-8 -*- use strict; use warnings; test_2(); exit 0; sub test_2{ my @a= 1..4; mypush( @a, 5..8); print join( ",", @_), "\n"; } exit 0; sub mypush(@@){ if( @_== 2){ print "ok.\n"; }else{ print "Prototypes does not work, arg. num=", 0+ @_, "\n"; } } □(出力2) Prototypes does not work, arg. num=8 ---- なお、Perlは、 perl -v This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi を使用しております。

専門家に質問してみよう