質問

書い私の最初のPerlアプリケーションには、AOLインスタントメッセンジャーボットとの会談をArduinoマイクロコントローラ、制御サーボと新しいパートナーシップを、電源ボタンに当社のsysadminのサーバー、凍毎にランダムに28時間ました。

いいただいた全ての硬いものは、私だけで追加しようとしていつのアリーナ、日産スタジアムのコードのメインループにログアウトの目的は、ユーザがプ'終了'.

問題は、私が読み込みSTDINからの主なグループでブロックまでの過程におけ入れ入りますが、基本的にレンダリングボットります。また試験のためのEOFの前に読み、ダイス...EOFでは常にfalseを返します。

こちらは下記はサンプルコードで仕事をしてい:

while(1) {
    $oscar->do_one_loop();

# Poll to see if any arduino data is coming in over serial port
    my $char = $port->lookfor();

# If we get data from arduino, then print it
    if ($char) {
        print "" . $char ;
    }

    # reading STDIN blocks until input is received... AAARG!
    my $a = <STDIN>;
    print $a;
    if($a eq "exit" || $a eq "quit" || $a eq 'c' || $a eq 'q') {last;}
}

print "Signing off... ";

$oscar->signoff();
print "Done\n";
print "Closing serial port... ";
$port->close() || warn "close failed";
print "Done\n";
役に立ちましたか?

解決

Perlと同様ですが、 select(), であるパススルーに select() システムコールが、sane人にオススメ IO::Select.

サンプルコード:

#!/usr/bin/perl

use IO::Select;

$s = IO::Select->new();
$s->add(\*STDIN);

while (++$i) {
  print "Hiya $i!\n";
  sleep(5);
  if ($s->can_read(.5)) {
    chomp($foo = <STDIN>);
    print "Got '$foo' from STDIN\n";
  }
}

他のヒント

これらの IO::選択 作品と標準出力に出力が閉じる場合などの上流工程におけるインフォメーションを終了、または入力からのファイルです。ただし、出力は継続などから"テール-f")にその部分のデータをバッファリング <STDIN> 表示されません。代わりに使用しますのunbuffered sysread:

#!/usr/bin/perl
use IO::Select;
$s = IO::Select->new(\*STDIN);

while (++$i) {
        if ($s->can_read(2)) {
                last unless defined($foo=get_unbuf_line());
                print "Got '$foo'\n";
        }
}

sub get_unbuf_line {
        my $line="";
        while (sysread(STDIN, my $nextbyte, 1)) {
                return $line if $nextbyte eq "\n";
                $line .= $nextbyte;
        }
        return(undef);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top