2011-01-31 31 views
6

私はパイプを処理するPerlスクリプトを持っています。ある時点で、スクリプトを一時停止してユーザーのキーボード入力を求めてください。 my $input = <STDIN>;は機能しません。パイプから次の行を読み込むだけです。パイプ入力とキーボード入力のためにPerlで異なるハンドルを使用するにはどうすればいいですか?パイプ入力とキーボード入力用に異なるハンドルを使用する方法

答えて

12

Unixプラットフォームの場合は、ファイルハンドルを/dev/tty(またはIO::Pty)にすることができます。
TTYでの作業の良い例が、ここでは例「のテストかどうかは、プログラムが対話的に実行されている」である:http://pleac.sourceforge.net/pleac_perl/userinterfaces.html

また、(perlfaq8で説明)Term::ReadKey経由でパスワードIOを行うことを検討すべきである - 私はそれがTTYに接続するかもしれないと思いますSTDIOではなく確信しています。そうでない場合は、this SO answer by brian d foyの末尾に記載されているTTY + Term :: ReadKeyソリューションを使用します。

例を示します。

It's not the best style (doesn't use 3-arg form of open, nor uses lexical filehandles)でも動作します。

use autodie; # Yay! No "or die '' " 
use Term::ReadKey; 
open(TTYOUT, ">/dev/tty"); 
print TTYOUT "Password?: "; 
close(TTYOUT); 
open(TTY, "</dev/tty"); 
ReadMode('noecho'); 
$password = ReadLine(0, *TTY); 
+0

問題を解決しました。どうもありがとう。 – Arkady

+0

@Arkady - あなたは大歓迎です。回答を受け入れるには、その隣にあるチェックマークをクリックしてください(回答が2点も得られます)。また、回答の上に投票する(その横にある上矢印) – DVK