在列表中使用未初始化的值

时间:2017-12-22 19:33:29

标签: arrays perl initialization

我从URL加载了一些变量,并希望检查我的CGI脚本是否已初始化。我很快发现我无法将未初始化的值放入Perl的列表中。

我的方法只是遍历列表并使用切换变量$sucessDOM(如果所有数据都已初始化,则为1,其他地方为0)。

我想出了这个:

### Read data from HTML
my $mailinglist = param( 'mailinglist' );
my $firstname   = param( 'firstname' );
my $lastname    = param( 'lastname' );
my $mail        = param( 'mail' );

my $sucessDOM = 0;

my @DOM = { $mailinglist, $firstname, $lastname, $mail };

### Data validation
for my $data ( @DOM ) {

    if ( $data eq undef ) {
        $sucessDOM = $sucessDOM + 1;
    }

    if ( $sucessDOM = @DOM ) {
        print "@DOM\n";
        $sucessDOM = 1;
    }
    else {
        $sucessDOM = 0;
    }
}

输出如下

[Fri Dec 22 20:30:40 2017] read_form.cgi: Use of uninitialized value $mailinglist in anonymous hash ({}) at ./read_form.cgi line 20.
[Fri Dec 22 20:30:40 2017] read_form.cgi: Use of uninitialized value $lastname in anonymous hash ({}) at ./read_form.cgi line 20.
[Fri Dec 22 20:30:40 2017] read_form.cgi: Use of uninitialized value in string eq at ./read_form.cgi line 24.
HASH(0x55c8a73eeea8)

我也无法理解为什么数组中的两个值都是未初始化时只有两个值的错误,因为我直接运行脚本而不传递任何值。

1 个答案:

答案 0 :(得分:3)

您的代码至少有四个问题:

首先,{}生成一个匿名哈希并返回对它的引用;这是一个以@DOM结尾的单个值。警告是因为散列键必须是字符串,并且如果它们是undef则发出警告。你应该分配像

my @DOM = ( $mailinglist, $firstname, $lastname, $mail );

其次,eq会比较字符串,因此会将undef转换为''。要测试$ data是否为undef,请执行

if (! defined $data) {

第三,你正在检查for循环中是否所有的数组元素都成功了(除了循环的最后一次迭代之外,它不会是真的)。将if ($successDOM...块移动到for循环之后。

第四,=只是一个赋值运算符;使用==进行数字比较:

if ($successDOM == @DOM) {