繁体   English   中英

在 Perl 中,如何检查未定义的 OR 空白参数?

[英]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::StdGetopt::Long ),可以轻松创建灵活的命令行选项集。 我建议您考虑使用其中之一。

这几乎涵盖了您正在寻找的任何内容:

 if ( not length( $id )) { 
     ...
 }

又名:

 unless ( length $id ) { 
     ...
 }

如果您的窗口立即消失,通常表示编译错误。 您应该打开命令窗口并从命令行运行脚本:

  • 点击“开始”
  • 在搜索栏中键入“cmd”,然后按 Enter

然后从命令行运行脚本,如下所示:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM