كيف يمكنني التحقق (نظرة خاطفة) STDIN للبيانات المنقولة بالأنابيب في بيرل دون استخدام حدد؟
-
21-08-2019 - |
سؤال
وأنا أحاول أن التعامل مع احتمال أن لا الحجج وأية بيانات المنقولة بالأنابيب يتم تمرير إلى برنامج نصي بيرل. أفترض أنه إذا كان هناك أي حجج ثم إدخال يتم ضخها عبر STDIN. ومع ذلك إذا كان المستخدم لا يقدم أي حجج ولا شيء أنبوب للنص، وسوف محاولة للحصول على مدخلات لوحة المفاتيح. هدفي هو تقديم رسالة خطأ بدلا من ذلك.
ولسوء الحظ، ليس select()
المحمولة لبعض الأنظمة غير POSIX.
هل هناك طريقة أخرى للقيام بذلك مع قابلية الأقصى؟
المحلول
وبيرل يأتي مع -t
مشغل الملفات الاختبار، الذي يخبرك إذا كان filehandle خاص مفتوح ل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.
}
اختبار سريع يكشف هذا العمل بشكل جيد على ويندوز مع بيرل 5.10.0 و Linux مع بيرل 5.8.8، لذلك ينبغي أن تكون محمولة عبر بيئات بيرل الأكثر شيوعا.
وكما ذكر آخرون، 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)'