我正在尝试使用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功能而不添加新元素?
答案 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 = [];