我遇到了以下代码行。它有问题:
这里是:
$array [++$#array] = 'data';
我的问题是:预增量$#数组意味着什么?我一直认为$#array是一个数组的属性,而不是可写的。
答案 0 :(得分:14)
perldata说:
“数组的长度是一个标量值。你可以通过评估$#days来找到数组@days的长度,就像在csh中一样。但是,这不是数组的长度;它是下标的最后一个元素,它是一个不同的值,因为通常有第0个元素。分配给$#days实际上会改变数组的长度。这样缩短数组会破坏插入值。延长先前缩短的数组不能恢复在那些元素中。“
修改$#array在某些情况下很有用,但在这种情况下,明显推送更好。
答案 1 :(得分:4)
将大于当前数组长度的值分配给$#array
会扩展数组。
答案 2 :(得分:4)
后增量将首先返回变量然后递增它。
如果你使用后增量,你将修改最后一个元素,因为它首先返回,然后将空元素推到末尾。在第二个循环中,您将修改该空值并推送一个新的空值以供日后使用。所以它根本不像推动那样工作。
预增量将增加变量然后返回它。这样你的例子将始终写入数组的新的最后一个元素,并像push一样工作。示例如下:
my (@pre, @post);
$pre[$#pre++] = '1';
$pre[$#pre++] = '2';
$pre[$#pre++] = '3';
$post[++$#post] = '1';
$post[++$#post] = '2';
$post[++$#post] = '3';
print "pre keys: ".@pre."\n";
print "pre: @pre\n";
print "post keys: ".@post."\n";
print "post: @post\n";
输出:
pre keys: 3
pre: 2 3
post keys: 3
post: 1 2 3
答案 3 :(得分:3)
此代码也适用:
$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a'
Hello world!
Perl数组是动态的,当超出限制时会增长。
答案 4 :(得分:1)
首先,这是犯规。
那就是说,我也很惊讶它有效。我猜想++$#array
会在尝试递增数字时得到“无法修改常量”错误。 (当然,并不是说我偶然会这样做。)但是,我猜这正是我们错的地方:$#array
不是常数(数字);这是一个变量表达式。因此你可以搞砸它。请考虑以下事项:
my @array = qw/1 2 3/;
++$#array;
$array[$#array] = qw/4/;
print "@array\n"
甚至,为了更多的乐趣,这个:
my @array = qw/1 2 3/;
$#array += 5;
foreach my $wtf (@array) {
if (defined $wtf) {
print "$wtf\n";
}
else {
print "undef\n";
}
}
而且,是的, Perl Cookbook 很高兴与$#array
混淆成长或截断数组(第4章,第3章)。我仍觉得它很难看,但也许这只是一种挥之不去的“但这是一个数字”的偏见。