2014-09-03 48 views
1

可能是一个简单的Perl问题:在Perl中,如何检查未定义的OR空白参数?

我有一些类似于下面的代码:

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 ),通过毛坯的unpassed的,所以我想下面将工作:

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

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

+0

空白仍然定义。它只是空白。 – 2014-09-03 18:24:26

+1

[ysth's answer](http://stackoverflow.com/a/25651344/176646)在你的逻辑中解决了这个问题,但是请看[如何简明地检查一个$变量是否被定义并且包含一个非零长度的字符串?] (http://stackoverflow.com/questions/1480066/in-perl-how-can-i-concisely-check-if-a-variable-is-defined-and-contains-a-non)替代解决方案。 – ThisSuitIsBlackNot 2014-09-03 18:50:10

+0

感谢所有有用的答案。奖品归属于@ysth。戴夫克罗斯 - 如果我只是能够改变这一点,但它已经被从多个地方调用,我有时间只做一个快速修复:( – roryhewitt 2014-09-04 19:25:03

回答

4

您正在使用低优先级not,您应该使用高优先级!

所以你说:

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

这就好比:

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

这始终是假的。

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

很多涵盖了你正在寻找的任何东西。

又名:

unless (length $id) { 
    ... 
} 
+3

注意:这在Perl 5.12之前发出警告 – ikegami 2014-09-03 19:06:51

+1

解释了错误会更好。 – ikegami 2014-09-03 19:07:38

0

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

单击“开始” 键入“cmd”到搜索栏并按回车。

然后在命令行中运行脚本如下: “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. 
} 
1

您已经收到很好的答案解释到底什么是你的代码错误。但是没有人对更大的图景发表评论。

使用像这样的位置参数是(如你所见)当参数变为可选时会产生问题。在这种情况下,使用命名参数是个好主意。标准的Perl库带有两个模块(Getopt::StdGetopt::Long),可以很容易地创建灵活的命令行选项集。我建议你看看使用其中之一。

+1

总是以Getopt :: Long开头;没有理由使用:: Std来代替新代码 – ysth 2014-09-04 16:06:23