3

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

代码 :

$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

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

如何在不添加新元素的情况下使用定义的功能?

4

5 回答 5

7

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

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

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

于 2012-06-27T17:39:29.983 回答
5

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

于 2012-06-27T17:57:23.983 回答
3

当您提到 时$mylist[2][0],perl 的自动生成会创建数组元素$mylist[2]

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

if ( (defined $mylist[2]) && (defined $mylist[2][0]) )
于 2012-06-27T17:40:52.527 回答
3
defined($mylist[2][0])

相当于

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

这是缩写

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

由于自生化。您可以使用autovivification pragma 禁用自动激活。

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

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

if (defined($mylist[2]) && defined($mylist[2][0]))
于 2012-06-27T17:50:22.063 回答
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 = [];
于 2012-06-27T17:43:03.680 回答