在Perl中,如何在二维数组的元素上使用'defined'函数?

时间:2012-06-27 17:34:16

标签: perl multidimensional-array defined autovivification

我正在尝试使用Perl中的defined函数来检查元素是否已定义。

代码:

$mylist[0][0]="wqeqwe";
$mylist[0][1]="afasf";
$mylist[1][0]="lkkjh";

print scalar(@mylist), "\n";

if (defined($mylist[2][0])){print "TRUE\n";}

print scalar(@mylist), "\n";

输出

2
3

在使用defined函数之前,@myarray的第一维中有两个元素。使用defined函数后,元素数量增加到3.

如何使用defined功能而不添加新元素?

5 个答案:

答案 0 :(得分:7)

首先检查第一级引用是否存在。

if ( defined($mylist[2]) && defined($mylist[2][0]) ) {
    print "TRUE\n";
}

您遇到的问题称为autovivification:在某些情况下,Perl会在您使用它们时创建复杂的数据结构,就好像它们已经存在一样。

答案 1 :(得分:5)

有趣的是,有一个名为autovivification的非核心编译,如果您在no autovivification;下运行代码,您的问题就会消失。

答案 2 :(得分:3)

当您引用$mylist[2][0]时,perl的autovivification会创建数组元素$mylist[2]

为了防止这种情况,您可以先检查此元素:

if ( (defined $mylist[2]) && (defined $mylist[2][0]) )

答案 3 :(得分:3)

defined($mylist[2][0])

相当于

defined($mylist[2]->[0])

的缩写
defined( ( $mylist[2] //= [] )->[0])

由于自动化。您可以使用autovivification编译指示禁用自动生成。

no autovivificatoin;
if (defined($mylist[2][0]))

或者您可以避免评估会触发它的代码。

if (defined($mylist[2]) && defined($mylist[2][0]))

答案 4 :(得分:2)

实际上因为它是自动修复,你可以在使用定义之前和之后使用Data :: Dumper轻松检查它。

use Data::Dumper;
my @mylist;

$mylist[0][0]="wqeqwe";
$mylist[0][1]="afasf";
$mylist[1][0]="lkkjh";

print Dumper(@mylist);

之前的输出
$VAR1 = ['wqeqwe', 'afasf'];
$VAR2 = [ 'lkkjh'];


print Dumper(@mylist);

之后的输出
$VAR1 = [ 'wqeqwe','afasf' ];
$VAR2 = ['lkkjh'];
$VAR3 = [];