Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,如何检查未定义或空白参数?_Perl - Fatal编程技术网

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

在Perl中,如何检查未定义或空白参数?,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 = &

我有如下代码:

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.
}
perl "myperlroutine.pl" "" "Mickey Mouse" "Entry"
命令窗口(我在Windows上运行此命令)短暂出现,然后立即消失


我是否遗漏了一些明显的内容?

您使用的是低优先级
而不是应该使用高优先级

你是说:

if ( not( defined $id || $id eq "" ) )
这就像:

if ( ! defined $id && $id ne '' )
这总是错误的

我也是

相反

对于Perl 5.12及更高版本,length()在传递undef时不再发出警告,这非常方便。因此,您可以简单地执行以下操作:

if ( ! length $id ) {
这是一个短代码,但是如果
$id
可能是一个长UTF-8字符串,那么确定长度很困难,那么它可能会效率低下。在那里,我更倾向于做:

if ( ( $id // '' ) eq '' ) {

但是,除非你熟悉这个习惯用法,否则它的可读性不是很好。

这几乎涵盖了你要找的任何东西:

 if ( not length( $id )) { 
     ...
 }
又名:


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

  • 单击“开始”
  • 在搜索栏中键入“cmd”,然后按Enter键
然后从命令行运行脚本,如下所示:

perl full_path_to_script\script_name.pl
如果执行此操作,命令窗口不应立即关闭。相反,它应该提供一些反馈,说明脚本无法运行的原因。如果这样做之后仍然无法找出失败的原因,那么也应该发布编译错误,我们可以查看一下

也。你应该用“!”而不是“不”

例如:

if ((!defined $id) || ($id eq '')) {
    print "Enter ID number: ";
    chomp ($id = <STDIN>);
    exit 0 if ($id eq ""); # If empty string, exit.
}
if((!defined$id)| |($id eq')){
打印“输入ID号:”;
chomp($id=);
如果($id eq“”)则退出0;#如果字符串为空,则退出。
}

您已经收到了很好的答案,准确地解释了代码的错误。但没有人对大局发表评论


当参数变为可选时,使用这样的位置参数(如您所见)是有问题的。在这种情况下,最好使用命名参数。标准的Perl库带有两个模块(和),这使得创建灵活的命令行选项集变得容易。我建议您考虑使用其中之一。

仍然定义了一个空白。只是一片空白。在您的逻辑中解决此问题,但请参阅以获取替代解决方案。感谢所有人提供有用的答案。奖品将颁发给@ysth。Dave Cross-如果我只能更改它,但是它已经被从许多地方调用了,我只有时间来做一个快速修复:(注意:在Perl 5.12之前发出警告,对错误进行解释会更好。始终从Getopt::Long开始;没有理由在新代码中使用::Std
 unless ( length $id ) { 
     ...
 }
perl full_path_to_script\script_name.pl
if ((!defined $id) || ($id eq '')) {
    print "Enter ID number: ";
    chomp ($id = <STDIN>);
    exit 0 if ($id eq ""); # If empty string, exit.
}