题
我遇到了以下代码行。它有以下问题:
- 它的目的与推送相同
- 它应该使用推送
- 很难阅读、理解
- 我已经将其更改为使用推送
- 它做了一些我认为是非法的事情,但显然不是
这里是:
$array [++$#array] = 'data';
我的问题是:预增 $#array 是什么意思?我一直认为 $#array 是数组的一个属性,并且不可写。
解决方案
佩尔数据 说:
“数组的长度是一个标量值。您可以通过评估 $#days 来找到数组 @days 的长度,如 csh 中所示。然而,这不是数组的长度;而是数组的长度。它是最后一个元素的下标,它是一个不同的值,因为通常有第 0 个元素。分配给 $#days 实际上改变了数组的长度。以这种方式缩短数组会破坏中间值。延长之前缩短的数组不会恢复这些元素中的值。”
修改 $#array 在某些情况下很有用,但在这种情况下,显然推送更好。
其他提示
后递增将首先返回变量,然后递增它。
如果您使用后增量,您将修改最后一个元素,因为它首先返回,然后将一个空元素推到末尾。在第二个循环中,您将修改该空值并推送一个新的空值以供稍后使用。所以它根本不会像推送一样起作用。
预自增将使变量递增,然后返回它。这样,您的示例将始终写入数组的新的最后一个元素,并且像推送一样工作。下面的例子:
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
分配一个大于当前数组长度的值 $#array
扩展数组。
这段代码也有效:
$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a'
Hello world!
Perl 数组是动态的,当分配超出限制时就会增长。
首先,这是犯规的。
也就是说,我也很惊讶它的效果。我本来就猜到了 ++$#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 食谱 很乐意惹事 $#array
增长或截断数组(第 4 章,秘诀 3)。我仍然觉得它丑陋,但这也许只是一种挥之不去的“但它是一个数字”的偏见。