我遇到了以下这行代码。它存在一些问题:
- 本意是执行push的操作
- 应该使用push才对
- 很难读懂、理解
- 我已经改为使用push
- 它执行了我认为非法的操作,但显然不是
代码如下:
$array [++$#array] = 'data';
我的问题是:什么意思是预增加$#array?我一直认为$#array是数组的一个属性,不可写入。
perldata 表示:
"数组的长度是一个标量值。您可以通过计算 $#days 来查找数组 @days 的长度,就像在 csh 中一样。然而,这不是数组的长度;它是最后一个元素的下标,由于通常存在第0个元素,因此这是一个不同的值。实际上,将值分配给 $#days 会更改数组的长度。这种方式缩短数组会破坏中间的值。之前被缩短的数组增加长度并不能恢复那些元素中的值。"
在某些情况下修改 $#array 是有用的,但在这种情况下,显然使用 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
$#array
会扩展数组。这段代码也可以运行:
$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a'
Hello world!
Perl数组是动态的,当超出限制时可继续增长。
++$#array
是无用的。 - Hynek -Pichi- Vychodil+1
操作才能计算出正确的数组索引(如果您真的非常想通过下标访问数组而不是推送)。顺便说一句,++
很容易输入。那么对于额外的混淆,如何使用$a[@a] = 1? - JB.++$#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个配方)。我仍然觉得它很丑陋,但也许这只是一种持久的“但它是一个数字”的偏见。