引数もパイプされたデータも Perl スクリプトに渡されない可能性を処理しようとしています。引数がない場合、入力はSTDIN経由でパイプされていると想定しています。ただし、ユーザーが引数を指定せず、スクリプトに何もパイプしない場合、キーボード入力を取得しようとします。私の目的は、代わりにエラー メッセージを提供することです。
残念ながら、select()
一部の非 POSIX システムには移植できません。移植性を最大限に高めてこれを行う別の方法はありますか?
引数もパイプされたデータも Perl スクリプトに渡されない可能性を処理しようとしています。引数がない場合、入力はSTDIN経由でパイプされていると想定しています。ただし、ユーザーが引数を指定せず、スクリプトに何もパイプしない場合、キーボード入力を取得しようとします。私の目的は、代わりにエラー メッセージを提供することです。
残念ながら、select()
一部の非 POSIX システムには移植できません。移植性を最大限に高めてこれを行う別の方法はありますか?
Perl には-t
file-test 演算子が付属しており、特定のファイルハンドルが TTY に対して開いているかどうかがわかります。したがって、これを行うことができるはずです:
if ( -t STDIN and not @ARGV ) {
# We're talking to a terminal, but have no command line arguments.
# Complain loudly.
}
else {
# We're either reading from a file or pipe, or we have arguments in
# @ARGV to process.
}
簡単なテストでは、これが Perl 5.10.0 を使用する Windows と Perl 5.8.8 を使用する Linux で正常に動作することを示しているため、最も一般的な Perl 環境で移植可能であるはずです。
他の人が述べたようにselect
、プロセスから読み取りを行っている場合があるため、信頼できる選択ではありませんが、そのプロセスはまだ書き込みを開始していません。
ではごきげんよう、
ポール
use POSIX 'isatty';
if ( ! @ARGV && isatty(*STDIN) ) {
die "usage: ...";
}
参照: http://www.opengroup.org/onlinepubs/009695399/functions/isatty.html
パイプされた情報がまだ準備されていない場合、誤った結果が生成されるため、選択はとにかくあまり役に立たないことに注意してください。例:
seq 100000|grep 99999|perl -we'$rin="";vec($rin,fileno(STDIN),1)=1;print 0+select($rin,"","",.01)'