我需要能够将数组切片绑定到原始数组,以便对原始数组(包括删除元素)所做的任何更改也将对数组切片进行。有没有办法做到这一点?
以下示例不起作用我希望如何实现,但它只是为了证明我想要表达的观点。
示例:
my @array = 1 .. 10;
my @slice = @array[3 .. 8];
splice @array, 5, 2;
print "ARRAY: ";
print join ', ', @array;
print "\n";
print "SLICE: ";
print join ', ', @slice;
输出:
ARRAY: 1, 2, 3, 4, 5, 8, 9, 10
SLICE: 4, 5, 6, 7, 8, 9
我正在寻找的是一种将切片绑定到原始数组的方法,因此输出看起来像这样:
ARRAY: 1, 2, 3, 4, 5, 8, 9, 10
SLICE: 4, 5, 8, 9
从原始数组中删除6和7也会将其从数组切片中删除。
我怎样才能达到这样的目标?
答案 0 :(得分:0)
如上所述,这是一个很高的要求。最简洁的答案是不。切片将创建元素的副本。
Perl确实具有Tie功能,这可能只是窍门。
perltie - how to hide an object class in a simple variable
因此,它从根本上改变了变量在幕后的作用。一个可能性的世界打开了,您的情况就在那里。
答案 1 :(得分:0)
假设要删除的项目是唯一的,例如如果您将其基于数据库的主键,则可以使用List :: MoreUtils;中的first_index;
这是一个样本。
use List::MoreUtils qw(first_index);
my @x = qw (1 2 3 4 5 6 7 8 9 10);
my @y = qw (4 5 6 7 8 9);
## Let's say you want to remove 2 items after the 5th index
my $position = 5;
my $length = 2;
## Get the value of items to remove first
for (my $i=1;$i<=$length;$i++) {
my $removeditem = $x[$position];
my $remove = first_index { $_ eq $removeditem } @y;
splice @x, $position, 1;
splice @y, $remove, 1;
}
print "Array X\n";
print "$_," foreach(@x);
print "\nArray Y\n";
print "$_," foreach(@y);
print "\n";
您应该得到想要的结果。
Array X
1,2,3,4,5,8,9,10,
Array Y
4,5,8,9,