如何在Perl中缩短数组?我读了一些网页,表明我可以分配:
$#ARRAY = 42;
我读到$#的使用已被弃用.我需要一个适用于数组数组的解决方案.这不起作用:
$#$ARRAY[$i] = 42;
Rob N.. 16
我不知道分配$#ARRAY
被弃用; perldoc perldata
从5.10.0开始肯定没有提到它.这是截断数组的最快方法.
如果您想要更具可读性的东西,请使用splice
:
splice @ARRAY, 43;
(注意43
代替42
- $#ARRAY
获取数组的最后一个索引,而改为取代数组splice
的长度).
至于处理数组数组,我假设你的意思是能够通过引用截断嵌套数组?在这种情况下,你想要:
$#{$ARRAY->[7]} = 42;
要么
splice @{$ARRAY->[7]}, 43;
Frosty.. 10
您的选择几乎是无限的(我在这里概述了五种方法),但您的策略将取决于您的具体需求和目标.(所有示例都将@array转换为不超过$ N个元素)
[编辑]
正如其他人所指出的那样,原始问题中建议的方式实际上并没有被弃用,它提供了最快,最简洁但不一定是最易读的解决方案. 它还有使用空元素扩展少于$ N元素的数组的副作用:
$#array = $N-1;
最少代码:
#best for trimming down large arrays into small arrays @array = $array[0..($N-1)];
最有效的方法是修剪大型阵列中的少量数据:
#This is a little less expensive and clearer splice(@array, $n, @#array);
几乎在所有情况下都不受欢迎,除非你真的喜欢delete():
#this is the worst solution yet because it requires resizing after the delete while($N-1 < $#array) { delete(array[$i]); }
如果您以相反的顺序需要列表的其余部分,则非常有用:
#this is better than deleting because there is no resize while($N-1 < $#array) { pop @array; #or, "push $array2, pop @array;" for the reverse order remainder }
有用的长期节省时间:
#don't put more values into the array than you actually want
ysth.. 7
$#
不推荐使用该变量,但该$#array
功能不是.
要$#array
在产生数组引用的任意表达式上使用语法,请执行此操作$#{ EXPR }
.
请参阅无价之宝:http://perlmonks.org/? node = Reference = quick + reference
我不知道分配$#ARRAY
被弃用; perldoc perldata
从5.10.0开始肯定没有提到它.这是截断数组的最快方法.
如果您想要更具可读性的东西,请使用splice
:
splice @ARRAY, 43;
(注意43
代替42
- $#ARRAY
获取数组的最后一个索引,而改为取代数组splice
的长度).
至于处理数组数组,我假设你的意思是能够通过引用截断嵌套数组?在这种情况下,你想要:
$#{$ARRAY->[7]} = 42;
要么
splice @{$ARRAY->[7]}, 43;
您的选择几乎是无限的(我在这里概述了五种方法),但您的策略将取决于您的具体需求和目标.(所有示例都将@array转换为不超过$ N个元素)
[编辑]
正如其他人所指出的那样,原始问题中建议的方式实际上并没有被弃用,它提供了最快,最简洁但不一定是最易读的解决方案. 它还有使用空元素扩展少于$ N元素的数组的副作用:
$#array = $N-1;
最少代码:
#best for trimming down large arrays into small arrays @array = $array[0..($N-1)];
最有效的方法是修剪大型阵列中的少量数据:
#This is a little less expensive and clearer splice(@array, $n, @#array);
几乎在所有情况下都不受欢迎,除非你真的喜欢delete():
#this is the worst solution yet because it requires resizing after the delete while($N-1 < $#array) { delete(array[$i]); }
如果您以相反的顺序需要列表的其余部分,则非常有用:
#this is better than deleting because there is no resize while($N-1 < $#array) { pop @array; #or, "push $array2, pop @array;" for the reverse order remainder }
有用的长期节省时间:
#don't put more values into the array than you actually want
$#
不推荐使用该变量,但该$#array
功能不是.
要$#array
在产生数组引用的任意表达式上使用语法,请执行此操作$#{ EXPR }
.
请参阅无价之宝:http://perlmonks.org/? node = Reference = quick + reference
你基本上自己给出了规范的答案.您可以通过设置最后一个索引来缩短数组:
$#Array = 42
绝对不会弃用表示数组中最后一个索引的$ #Foo表示法.同样,分配给它也不会被弃用.引用perldata文档:
数组的长度是标量值. 你可以通过评估$#days来找到数组@days的长度,就像在csh中一样.但是,这不是阵列的长度; 它是最后一个元素的下标,它是一个不同的值,因为通常有第0个元素. 分配到$#days实际上会更改数组的长度. 以这种方式缩短阵列会破坏干预值.延长先前缩短的数组不会恢复这些元素中的值.(它曾经在Perl 4中这样做,但我们不得不打破这个以确保在预期时调用析构函数.)