回答
if (@ARGV == 0 && -t STDIN && -t STDERR) {
print STDERR "$0: WARNING: reading input from keyboard, type ^D for EOF, ^C to intr.\n";
}
這個習語可以在維護和記錄的模塊中找到:http://p3rl.org/IO::Interactive+is_interactive() – daxim
@daxim:恐怕這是我*不會那樣做的事情* 喜歡。 **完全可以**對於一些瘋狂的CPAN模塊來說,你不可能依賴在那裏,特別是當PurePerl™版本簡單,清晰並且已經建立好的時候,這太神經質了。如果我在尋找Java,我確實知道從哪裏得到它。這就像告訴人們使用一些愚蠢的誹謗CPAN模塊,因爲說話者對Perl內置變量產生了恐慌:這是他們自己的問題,他們不應該通過暗示比他們自己的不安全更糟糕的「治療」關於Perl。 – tchrist
我知道這會讓你感到不舒服。恐怕你的意見是少數派,每個中級技能程序員都知道贊成使用模塊的論點。 – daxim
'$#ARGV'包含'@ ARGV'最後一個元素的索引,即參數個數減1。 – mob
如果要談論從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);
}
參考文獻:
這是[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
測試'$ myInput eq「」'告訴你輸入是否是空行,而不是沒有輸入(取決於OP意味着什麼「沒有輸入」)。 –
謝謝!根據你的建議,我更新了我的答案。 – Bill
您也可能會發現以檢查是否存在從鍵盤輸入任何這種的perldoc FAQ有用:
http://perldoc.perl.org/perlfaq8.html#How-do-I-check-whether-input-is-ready-on-the-keyboard%3f
如果腳本是使用鍵盤上的stdin運行的,那麼在用戶開始輸入內容之前不會有任何可用的輸入。 –
http://perldoc.perl.org/perlfaq8.html#How-do-I-find-out-if-I'm-running-interactively-or-not%3f更適合這個問題。 – daxim
這是可能的檢查,如果事情有進來的STDIN(使用非阻塞讀,select
或ioctl FIONREAD
),但它是不可能的檢查,如果事情是即將在標準輸入,因爲它不發生了。
不可能拋開一邊,你打算打破慣例。例如,拿cat
,perl
,sort
等,如果你沒有提供參數,他們會很樂意等待STDIN,直到你提供他們需要的東西。
用戶知道使用man tool
或tool --help
來獲取信息。
什麼,你認爲'ioctl(STDIN,$ FIONREAD = 0x4004667F,$ long = pack(L => 0))'可能會讓他們陷入太多麻煩? :) – tchrist
@tchrist,我不知道這是做什麼。這是查看數據是否可用的第三種方法? – ikegami
是的,它是如何查看該描述符上有多少個未讀字節。但是你必須爲你的系統獲得正確的ioctl號碼,然後你必須使用一個未緩衝且未經編碼的原始'sysread',然後返回它的字節。你不能將它與stdio調用混合使用,因爲它只檢查待處理的內核緩衝區,而不是任何已經發送到用戶空間的內容緩衝區。 'FIONREAD'是ioctl的「文件I/O正在讀取的待讀未讀字節數」。見史蒂文斯。其答案落在「你真的不想知道」類別的那些問題之一。 – tchrist
- 1. getopts沒有提供參數
- 2. Mathematica:如何檢查是否沒有參數提供給函數?
- 3. 爲什麼不提供任何參數
- 4. Spark和Mesos:沒有提供任何
- 5. SSRS過程沒有參數並提供參數
- 6. 笨,沒有提供參數時?
- 7. 怪異「沒有提供參數」錯誤
- 8. 需要參數'@ID',它沒有提供?
- 9. 過程或函數期望沒有提供參數 - 但參數WAS提供
- 10. 如何禁用模板如果沒有提供模板參數?
- 11. ASP MVC創建參數,即使任何參數未提供
- 12. openssl_encrypt不起作用,並沒有提供任何錯誤?
- 13. PDO插入不能正常工作並且沒有提供任何錯誤?
- 14. SQL過程沒有提供參數和參數
- 15. 使用Boost.Test和CTest沒有爲參數color_output提供參數
- 16. 過程sp_Get--沒有提供參數和參數
- 17. 構造表示「沒有發現參數」時參數提供
- 18. 程序insertSerial沒有提供參數和參數
- 19. 是否有任何提供關聯數組能力的go庫?
- 20. JavaFX:爲任務提供參數
- 21. 當從JSP中獲取單選按鈕參數時,沒有爲SQL參數提供任何值
- 22. 是否有任何支持SREG或AX的所有OpenID提供者的參考?
- 23. 有沒有可能問是否有任何參數?
- 24. ProGuard中沒有任何參數的keepattribute是否承擔所有參數?
- 25. 如何檢查函數調用中是否提供了參數?
- 26. 有沒有辦法讓參數提供給php函數?
- 27. Atmospherejs是否提供任何API?
- 28. FLEX:如果語句沒有提供構造函數參數
- 29. ValueError:在Tensorflow中沒有爲任何變量提供漸變
- 30. check_box_tag沒有通過任何參數,如果沒有選中
它不是100%清楚你的意思是「什麼都沒有進來」。如果我運行你的腳本,並且我沒有輸入任何東西5分鐘,那麼這是否合格?如果我在10分鐘後開始打字怎麼辦? –