10

引数もパイプされたデータも Perl スクリプトに渡されない可能性を処理しようとしています。引数がない場合、入力はSTDIN経由でパイプされていると想定しています。ただし、ユーザーが引数を指定せず、スクリプトに何もパイプしない場合、キーボード入力を取得しようとします。私の目的は、代わりにエラー メッセージを提供することです。

残念ながら、select()一部の非 POSIX システムには移植できません。移植性を最大限に高めてこれを行う別の方法はありますか?

4

2 に答える 2

20

Perl には-tfile-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、プロセスから読み取りを行っている場合があるため、信頼できる選択ではありませんが、そのプロセスはまだ書き込みを開始していません。

ではごきげんよう、

ポール

于 2009-02-06T05:43:44.517 に答える
5
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)'
于 2009-02-06T05:03:09.323 に答える