预增量$#数组意味着什么?

时间:2009-03-02 14:06:48

标签: perl arrays syntax

我遇到了以下代码行。它有问题:

  • 它的目的与推送
  • 相同
  • 它应该使用push
  • 很难阅读,理解
  • 我已将其更改为使用push
  • 它做了我认为非法的事情,但显然不是

这里是:

$array [++$#array] = 'data';

我的问题是:预增量$#数组意味着什么?我一直认为$#array是一个数组的属性,而不是可写的。

5 个答案:

答案 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章)。我仍觉得它很难看,但也许这只是一种挥之不去的“但这是一个数字”的偏见。