回答
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. 为什么不提供任何参数
- 3. 存储过程没有参数并提供参数
- 4. 预计没有提供的参数
- 5. 需要参数'@ID',它没有提供?
- 6. 笨,没有提供参数时?
- 7. 过程或函数期望没有提供参数 - 但参数WAS提供
- 8. SQL过程没有提供参数和参数
- 9. 过程sp_Get--没有提供参数和参数
- 10. 构造表示“没有发现参数”时参数提供
- 11. 是否有任何提供关联数组能力的go库?
- 12. JavaFX:为任务提供参数
- 13. 当从JSP中获取单选按钮参数时,没有为SQL参数提供任何值
- 14. 是否有任何支持SREG或AX的所有OpenID提供者的参考?
- 15. 有没有可能问是否有任何参数?
- 16. 如何检查函数调用中是否提供了参数?
- 17. Atmospherejs是否提供任何API?
- 18. FLEX:如果语句没有提供构造函数参数
- 19. ValueError:在Tensorflow中没有为任何变量提供渐变
- 20. check_box_tag没有通过任何参数,如果没有选中
- 21. Mockito。没有捕获任何参数值
- 22. 是否有任何捷径在localhost中提供php页面?
- 23. spring-data-solr有没有办法提供json.facet参数?
- 24. 你有没有提供默认值的关键字参数?
- 25. “过程或函数期望没有提供的参数。”
- 26. 过程或函数'employee_pro'需要参数'@empid',它没有提供
- 27. 过程或函数期望没有提供的参数?
- 28. 程序或函数期望没有提供的参数
- 29. 过程或函数'spDelRegistrant'需要参数'@RegistrantId',但没有提供
- 30. 过程或函数'usp_User_Info2'需要参数'@UserName',它没有提供
它不是100%清楚你的意思是“什么都没有进来”。如果我运行你的脚本,并且我没有输入任何东西5分钟,那么这是否合格?如果我在10分钟后开始打字怎么办? –