どのように私は選択せずに使用してPerlでパイプで連結されたデータのために(PEEK)STDINを確認することができますか?
-
21-08-2019 - |
質問
私は引数なしパイプで連結されたデータは、Perlスクリプトに渡されていないという可能性に対処しようとしています。私は、引数がない場合、入力はSTDINを経由してパイプされていることを想定しています。ユーザーには、引数を提供しないと、スクリプトにパイプ何もしない場合しかし、それはキーボード入力を取得しようとします。私の目標ではなく、エラーメッセージを提供することです。
残念ながら、select()
は、いくつかの非POSIXシステムに移植することはできません。
最大の移植でこれを行うには、別の方法はありますか?
解決
Perlは、特定のファイルハンドルがTTYに開かれている場合を示しています-t
ファイルテスト演算子、付属しています。だから、あなたがこれを行うことができる必要があります:
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の環境間で移植する必要がありますので、これは、Perlの5.8.8でのPerl 5.10.0、およびLinuxとWindows上で細かい作業を明らかにします。
他の人が述べたように、あなたがプロセスから読んでいるときの時間があるかもしれないとして、、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)'
所属していません StackOverflow