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

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

这里是:

$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)。我仍然觉得它丑陋,但这也许只是一种挥之不去的“但它是一个数字”的偏见。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top