我正在写一个 Perl 脚本,希望在未接收到输入时显示帮助信息。
如何判断标准输入(stdin)中是否没有输入任何内容?
如何判断标准输入(stdin)中是否没有输入任何内容?
if (@ARGV == 0 && -t STDIN && -t STDERR) {
print STDERR "$0: WARNING: reading input from keyboard, type ^D for EOF, ^C to intr.\n";
}
$#ARGV
包含 @ARGV
的最后一个元素的索引,也就是说,参数数量减一。 - mob如果你在谈论来自 STDIN 的输入,你可以检查变量是否等于空字符串(在删除 CR/LF 后)。例如:
my $myInput = <STDIN>;
chomp($myInput);
if ($myInput eq "")
{
print "Error! You didn't submit any data!\n";
}
然而,正如@thnee所说,如果您正在检查通过命令行传递的参数,则应使用$#ARGV。
例如:
if ($#ARGV == -1)
{
print "Error! No input arguments entered!\n";
exit(-1);
}
参考资料:
$myInput eq ""
可以告诉您输入是否为空行,但并不能确定是否没有输入(这取决于 OP 对“没有输入”的具体解释)。 - Keith Thompson你可能会发现这个 perldoc FAQ 对于检查键盘输入是否有任何输入很有用:
http://perldoc.perl.org/perlfaq8.html#How-do-I-check-whether-input-is-ready-on-the-keyboard%3f
可以通过非阻塞读取、选择(select)或IOCTL FIONREAD来检查是否有内容从标准输入流(STDIN)进入,但是无法检查内容是否正在从标准输入流(stdin)进入,因为这还没有发生。
暂且不谈不可能性,您在要求打破惯例。例如,考虑cat、perl、sort等等。如果您不提供参数,它们会愉快地在标准输入流(STDIN)上等待直到您提供所需内容。
用户知道使用man tool或tool --help获取信息。
ioctl(STDIN, $FIONREAD=0x4004667F, $long=pack(L=>0))
会让他们陷入麻烦吗? :) - tchristsysread
。您不能将其与stdio调用混合使用,因为它仅检查挂起的内核缓冲区,而不是已发送到用户空间的任何内容。 FIONREAD
是“待读取的未读字节数”的ioctl。请参见Stevens。这是那些答案属于“您真的不想知道”的问题之一。 - tchristselect
与写入器一起使用时,您会使用类似的东西,因为select
不会告诉您可以在不阻塞的情况下写入多少字节。 - ikegami