$char = <STDIN>;
と書くと
- ENTER キーを押すまでは入力されない
- 入力した文字がそのまま画面に表示される(エコーバック)
◇ (方法1) Term::ReadKey
を使う (Windows, UNIX)
Windows で使える方法はないかと思って調べたら、実は PerlFAQ に書いてあった方法。知らなかったが通常はこちらで OK だろう。
use Term::ReadKey; ReadMode('cbreak'); while(1) { if (defined ($char = ReadKey(-1)) ) { # 文字が入力された場合 print STDERR $char, "\n"; } else { # 文字が入力されていない場合 } } # ReadMode('normal');
こう書けば押したキーの文字がリアルタイムで $char に代入される。
何も押さなかった場合は「
#
文字が入力
されていない場合
」のほうが実行される。
"
Term::ReadKey" モジュールのインストールが必要。
便利なことに Windows のプロンプトでも利用できる。ActivePerl5.20.1 ではTerm::ReadKey モジュールは最初からインストールされていた。
◇ (方法2)
stty コマンドを使う (UNIX)
$|=0; system("stty cbreak"); system("stty -echo"); while(1) { sysread(STDIN,$char,1); print STDERR $char, "\n" }UNIX 限定だが、system() 関数で stty コマンドを実行することでも似たことが実現できる。
"
Term::ReadKey" モジュールがインストールできない場合はこちらで。 ただ、この書き方では何か文字が入力されるまで sysread(STDIN,$char,1); のところで動作が停止(ブロック) してしまうので、リアルタイムな処理はできない。リアルタイムに処理するためには工夫が必要になる。
この機能を求めていた。助かった。さんきゅー
返信削除コメントどうもでした。Windows 版の Perl でオセロゲームを作った時に調べた覚えがあります。
削除