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

时间:2014-09-03 18:21:21

标签: perl

可能是一个简单的Perl问题:

我有一些代码如下:

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上运行此命令)会短暂出现,然后立即消失。

我错过了一些明显的东西吗?

4 个答案:

答案 0 :(得分:5)

您使用的是低优先级not,您应该使用高优先级!

所以你说:

if ( not( defined $id || $id eq "" ) )

就像:

if ( ! defined $id && $id ne '' )

总是假的。

答案 1 :(得分:2)

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

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

AKA:

 unless ( length $id ) { 
     ...
 }

答案 2 :(得分:1)

您已经收到了很好的答案,解释了您的代码究竟出了什么问题。但没有人评论过更大的图景。

当参数变为可选时,使用这样的位置参数(如您所见)会出现问题。在这种情况下,使用命名参数是一个好主意。标准的Perl库带有两个模块(Getopt::StdGetopt::Long),可以轻松创建灵活的命令行选项集。我建议您考虑使用其中一种。

答案 3 :(得分:0)

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

点击“开始” 在搜索栏中输入“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.
}