当前位置:  开发笔记 > 编程语言 > 正文

如何在Perl中缩小数组?

如何解决《如何在Perl中缩小数组?》经验,为你挑选了4个好方法。

如何在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



1> Rob N..:

我不知道分配$#ARRAY被弃用; perldoc perldata从5.10.0开始肯定没有提到它.这是截断数组的最快方法.

如果您想要更具可读性的东西,请使用splice:

splice @ARRAY, 43;

(注意43代替42- $#ARRAY获取数组的最后一个索引,而改为取代数组splice长度).

至于处理数组数组,我假设你的意思是能够通过引用截断嵌套数组?在这种情况下,你想要:

$#{$ARRAY->[7]} = 42;

要么

splice @{$ARRAY->[7]}, 43;



2> Frosty..:

您的选择几乎是无限的(我在这里概述了五种方法),但您的策略将取决于您的具体需求和目标.(所有示例都将@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



3> ysth..:

$#不推荐使用该变量,但该$#array功能不是.

$#array在产生数组引用的任意表达式上使用语法,请执行此操作$#{ EXPR }.

请参阅无价之宝:http://perlmonks.org/? node = Reference = quick + reference



4> tsee..:

你基本上自己给出了规范的答案.您可以通过设置最后一个索引来缩短数组:

$#Array = 42

绝对不会弃用表示数组中最后一个索引的$ #Foo表示法.同样,分配给它也不会被弃用.引用perldata文档:

数组的长度是标量值. 你可以通过评估$#days来找到数组@days的长度,就像在csh中一样.但是,这不是阵列的长度; 它是最后一个元素的下标,它是一个不同的值,因为通常有第0个元素. 分配到$#days实际上会更改数组的长度. 以这种方式缩短阵列会破坏干预值.延长先前缩短的数组不会恢复这些元素中的值.(它曾经在Perl 4中这样做,但我们不得不打破这个以确保在预期时调用析构函数.)

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有