[英]In Perl, how do I check for an undefined OR blank parameter?
我有一些像下面这样的代码:
if (not defined $id) {
print "Enter ID number: ";
chomp ($id = <STDIN>);
exit 0 if ($id eq ""); # If empty string, exit.
}
if (not defined $name) {
print "Enter name: ";
chomp ($name = <STDIN>);
exit 0 if ($name eq ""); # If empty string, exit.
}
if (not defined $class) {
print "Enter class: ";
chomp ($class = <STDIN>);
exit 0 if ($class eq ""); # If empty string, exit.
}
我希望能够只传递其中的一些(例如,名称和类,但不传递 ID),为未传递的传递空白,所以我认为以下方法可行:
if (not defined $id || $id eq "") {
print "Enter ID number: ";
chomp ($id = <STDIN>);
exit 0 if ($id eq ""); # If empty string, exit.
}
但如果我通过,它似乎不起作用,例如,以下内容:
perl "myperlroutine.pl" "" "Mickey Mouse" "Entry"
命令窗口(我在 Windows 上运行它)短暂出现然后立即消失。
我错过了一些明显的东西吗?
您使用的是低优先级, not
您应该使用高优先级的地方!
.
所以你是说:
if ( not( defined $id || $id eq "" ) )
这就像:
if ( ! defined $id && $id ne '' )
这总是错误的。
也一样
if ( ! defined $id || $id eq '' )
反而。
在 Perl 5.12 及更高版本中,length() 在传递 undef 时不再发出警告,这非常方便。 所以你可以简单地做:
if ( ! length $id ) {
这是短代码,但如果$id
可能是一个很长的 UTF-8 字符串,那么它可能效率低下,在这种情况下很难确定长度。 在那里我更倾向于这样做:
if ( ( $id // '' ) eq '' ) {
但是除非您熟悉该习语,否则这不是超级可读的。
您已经收到了很好的答案,可以准确地解释您的代码有什么问题。 但没有人对更大的图景发表评论。
当参数变为可选时,使用这样的位置参数(如您所见)是有问题的。 在这种情况下,使用命名参数是一个更好的主意。 标准 Perl 库带有两个模块( Getopt::Std和Getopt::Long ),可以轻松创建灵活的命令行选项集。 我建议您考虑使用其中之一。
这几乎涵盖了您正在寻找的任何内容:
if ( not length( $id )) {
...
}
又名:
unless ( length $id ) {
...
}
如果您的窗口立即消失,通常表示编译错误。 您应该打开命令窗口并从命令行运行脚本:
然后从命令行运行脚本,如下所示:
perl full_path_to_script\script_name.pl
如果这样做,命令窗口不应立即关闭。 相反,它应该就您的脚本无法运行的原因提供一些反馈。 如果您在执行此操作后仍然无法弄清楚为什么它会失败,您也应该发布您的编译错误,我们可以查看它们。
此外, ysth 是正确的。 你应该使用“!” 而不是“不”。
例子:
if ((!defined $id) || ($id eq '')) {
print "Enter ID number: ";
chomp ($id = <STDIN>);
exit 0 if ($id eq ""); # If empty string, exit.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.