كيف يمكنني التحقق (نظرة خاطفة) STDIN للبيانات المنقولة بالأنابيب في بيرل دون استخدام حدد؟

StackOverflow https://stackoverflow.com/questions/518992

سؤال

وأنا أحاول أن التعامل مع احتمال أن لا الحجج وأية بيانات المنقولة بالأنابيب يتم تمرير إلى برنامج نصي بيرل. أفترض أنه إذا كان هناك أي حجج ثم إدخال يتم ضخها عبر 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)'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top