use feature qw/ say /;
use strict;
use warnings;
my $aref;
$#{$aref} = 4;
$aref->[2] = undef;
$aref->[3] = '';
foreach my $idx ( 0 .. $#{$aref} ) {
say "Testing $idx.";
say "\t$idx exists." if exists $aref->[$idx];
say "\t$idx defined." if defined $aref->[$idx];
}
OUTPUT:
Testing 0.
Testing 1.
Testing 2.
2 exists.
Testing 3.
3 exists.
3 defined.
Testing 4.
我们在匿名数组中预先分配了五个位置,@{$aref}
. 最高指数是4
。我们能够以与我们创建它的方式相同的方式找到顶部索引;通过测试 的值$#{$aref}
。我们可以测试存在。0
我们知道和4
被创造之间的一切。但是 Perl 只报告特定分配给它们的数组元素的“存在”(即使它是undef
)。因此,$aref->[2]
据报道存在,但未定义。只是为了好玩,我们指定''
查看$aref->[3]
一次定义的测试报告。但简而言之,即使数组是预先扩展的,我们仍然可以通过使用 ' 来测试使用 初始化undef
的元素和undef
通过数组预先扩展的元素之间的区别exists
'。
我不能说这是记录在案的exists
. 所以不能保证有一天它不会改变。但它适用于 5.8、5.10、5.12 和 5.14。
因此,寻找一种简单的方法来查找哪些元素已初始化,哪些已定义,哪些未定义,这是一个示例:
use feature qw/ say /;
use strict;
use warnings;
my $aref;
$#{$aref} = 4;
$aref->[2] = undef;
$aref->[3] = '';
my @initialized = grep { exists $aref->[$_] } 0 .. $#{$aref};
my @defined = grep { defined $aref->[$_] } 0 .. $#{$aref};
my @uninitialized = grep { not exists $aref->[$_] } 0 .. $#{$aref};
my @init_undef = grep { exists $aref->[$_] and not defined $aref->[$_] } 0 .. $#{$aref};
say "Top index is $#{$aref}.";
say "These elements are initialized: @initialized.";
say "These elements are not initialized: @uninitialized.";
say "These elements were initialized with 'undef': @init_undef.";
say "These elements are defined: @defined."