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

相关问题