Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 预增量$#数组意味着什么?_Perl_Arrays_Syntax - Fatal编程技术网

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

Perl 预增量$#数组意味着什么?,perl,arrays,syntax,Perl,Arrays,Syntax,我遇到了以下代码行。它有以下问题: 其目的与推送相同 它应该用推的 这很难阅读,理解 我把它改成了推 它做了一些我认为是非法的事情,但显然不是 这是: $array [++$#array] = 'data'; 我的问题是:预增量$#数组意味着什么?我一直认为$#array是数组的一个属性,不可写。将大于当前数组长度的值赋给$#array可以扩展数组。此代码也可以: $ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a'

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

  • 其目的与推送相同
  • 它应该用推的
  • 这很难阅读,理解
  • 我把它改成了推
  • 它做了一些我认为是非法的事情,但显然不是
这是:

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

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

将大于当前数组长度的值赋给
$#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 Cookbook很乐意使用
$#array
来增长或截断数组(第4章,配方3)。我仍然觉得这很难看,但也许这只是一种挥之不去的“但这是一个数字”偏见

说:

“数组的长度是一个标量值。您可以通过计算$#天来找到数组@days的长度,如csh中所示。但是,这不是数组的长度;它是最后一个元素的下标,这是一个不同的值,因为通常有第0个元素。分配给$#天实际上会更改数组的长度。以这种方式缩短数组会破坏中间的值。延长先前缩短的数组不会恢复这些元素中的值。”


修改$#数组在某些情况下很有用,但在这种情况下,push显然更好。

后增量将首先返回变量,然后对其进行增量

如果使用post increment,您将修改最后一个元素,因为它是第一个返回的元素,然后将一个空元素推到末尾。在第二个循环中,您将修改该空值,并在以后推一个新的空值。因此,它根本不会像推一样工作

预递增将递增变量,然后返回它。这样,您的示例将始终写入数组的最后一个新元素,并像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

我不知道+++$#数组怎么会不改变它。我假设赋值后,$#数组会再次修改,可能是相同的值。我认为,
++$#数组
在这里是无用的。你确实需要+++$#数组,如果你使用$#数组,你只会覆盖数组的最后一个元素(或者,如果数组为空,则会出现“试图修改不可创建的数组值,下标-1”错误)预增量的写回部分确实没有用处,但需要执行
+1
操作来计算正确的数组索引(考虑到您确实希望通过下标数组而不是推送来完成此操作).FWIW,
++
很容易键入。如果需要额外的混淆,$a[@a]=1如何?多么奇怪:@a[-$+$\a]=$\u0..9;print@aI相信该链接指向未经授权的书籍副本。我建议你删除它。实际上,该链接已经死了,但我同意链接到盗版书籍是个坏主意。当我检查它时,它没有死,而且那里还有一大堆其他书籍。欢迎访问互联网。为什么Manu要因为它而受到惩罚链接到他通过谷歌找到的东西?“虽然这些盗版很烦人,但它们几乎不会破坏我们的业务……许多侵权者都会回复……一封礼貌的信。那些无视我们请求的服务器通常都在那些没有书籍的国家……或者……太贵了”——一些名叫蒂姆的人:)我不确定你的看法,但我认为它很难看,因为它有4个标点符号,它们不是分隔符或排列符,排成一行……我的意思是,我还认为a=b+(foo?-$#数组:+$#数组);是难看的b-)递增运算符的“返回”值在我看来,这是一个重要的区别,我很高兴有人做到了。其中一个更好的例子是,当你提前知道你的数组最终会有多大时。使用巨大的数组,这将给你带来巨大的性能提升。在旧的Perls上,使用$#数组进行加长,将恢复以前的值。感谢编辑-这是我应该读的标题我写过。