2011-08-23 85 views

回答

8
if (@ARGV == 0 && -t STDIN && -t STDERR) { 
    print STDERR "$0: WARNING: reading input from keyboard, type ^D for EOF, ^C to intr.\n"; 
} 
+0

這個習語可以在維護和記錄的模塊中找到:http://p3rl.org/IO::Interactive+is_interactive() – daxim

+0

@daxim:恐怕這是我*不會那樣做的事情* 喜歡。 **完全可以**對於一些瘋狂的CPAN模塊來說,你不可能依賴在那裏,特別是當PurePerl™版本簡單,清晰並且已經建立好的時候,這太神經質了。如果我在尋找Java,我確實知道從哪裏得到它。這就像告訴人們使用一些愚蠢的誹謗CPAN模塊,因爲說話者對Perl內置變量產生了恐慌:這是他們自己的問題,他們不應該通過暗示比他們自己的不安全更糟糕的「治療」關於Perl。 – tchrist

+0

我知道這會讓你感到不舒服。恐怕你的意見是少數派,每個中級技能程序員都知道贊成使用模塊的論點。 – daxim

0

如果要談論從STDIN輸入,可以檢查變量是否等於空串(除去CR/LF之後)。例如:

my $myInput = <STDIN>; 
chomp($myInput); 
if ($myInput eq "") 
{ 
    print "Error! You didn't submit any data!\n"; 
} 

然而,隨着@thnee says,如果檢查通過命令行傳入的參數,你應該使用$#ARGV。

例如:

if ($#ARGV == -1) 
{ 
    print "Error! No input arguments entered!\n"; 
    exit(-1); 
} 

參考文獻:

http://perldoc.perl.org/functions/chomp.html

http://perldoc.perl.org/perlvar.html

+3

這是[thnee](http://stackoverflow.com/questions/7166811/how-can-i-tell-if-no-arguments-have-been-given-and-nothing-is-coming-in-on -stdin/7166870#7166870)誰提及'$#ARGV'。另外,您應該避免將其他答案稱爲「上方」(或「下方」),因爲得分相同的答案以隨機順序出現。相反,添加一個鏈接到引用的答案。 – erickson

+0

測試'$ myInput eq「」'告訴你輸入是否是空行,而不是沒有輸入(取決於OP意味着什麼「沒有輸入」)。 –

+0

謝謝!根據你的建議,我更新了我的答案。 – Bill

0

這是可能的檢查,如果事情進來的STDIN(使用非阻塞讀,selectioctl FIONREAD),但它是不可能的檢查,如果事情即將在標準輸入,因爲它不發生了。

不可能拋開一邊,你打算打破慣例。例如,拿cat,perl,sort等,如果你沒有提供參數,他們會很樂意等待STDIN,直到你提供他們需要的東西。

用戶知道使用man tooltool --help來獲取信息。

+0

什麼,你認爲'ioctl(STDIN,$ FIONREAD = 0x4004667F,$ long = pack(L => 0))'可能會讓他們陷入太多麻煩? :) – tchrist

+0

@tchrist,我不知道這是做什麼。這是查看數據是否可用的第三種方法? – ikegami

+0

是的,它是如何查看該描述符上有多少個未讀字節。但是你必須爲你的系統獲得正確的ioctl號碼,然後你必須使用一個未緩衝且未經編碼的原始'sysread',然後返回它的字節。你不能將它與stdio調用混合使用,因爲它只檢查待處理的內核緩衝區,而不是任何已經發送到用戶空間的內容緩衝區。 'FIONREAD'是ioctl的「文件I/O正在讀取的待讀未讀字節數」。見史蒂文斯。其答案落在「你真的不想知道」類別的那些問題之一。 – tchrist

相關問題