Arrays Perl:如何从没有空格的数组中删除元素
如何从索引4到10删除数组元素。我是这样做的Arrays Perl:如何从没有空格的数组中删除元素,arrays,perl,Arrays,Perl,如何从索引4到10删除数组元素。我是这样做的 #!usr/bin/perl @array=1..10; @array[0..3]=@array[5..8]; @array[4..10]=(); $str=(join ",",@array); print "$str\n"; 并将输出作为 6,7,8,9,,,,,,, 如何删除多余的,我假设这是一个家庭作业问题,因为如果不是这样的话,你会用这段代码做一些非常奇怪的事情 但是让我们来解决这个问题——过滤数组
#!usr/bin/perl
@array=1..10;
@array[0..3]=@array[5..8];
@array[4..10]=();
$str=(join ",",@array);
print "$str\n";
并将输出作为
6,7,8,9,,,,,,,
如何删除多余的,我假设这是一个家庭作业问题,因为如果不是这样的话,你会用这段代码做一些非常奇怪的事情 但是让我们来解决这个问题——过滤数组最简单的方法是使用grep 在本文中,我们使用grep过滤掉任何未定义的数组元素。如果大括号中的表达式的计算结果为true-$\设置为当前元素,并在隐式处理$\的任何测试中使用,则返回该元素。定义了,正则表达式匹配也一样 但是,如果确实希望将数组截断为任意数,则可以执行以下操作:
@array = @array[0..4]
我假设这是一个家庭作业问题,因为如果不是这样的话,你会用这个代码做一些非常奇怪的事情 但是让我们来解决这个问题——过滤数组最简单的方法是使用grep 在本文中,我们使用grep过滤掉任何未定义的数组元素。如果大括号中的表达式的计算结果为true-$\设置为当前元素,并在隐式处理$\的任何测试中使用,则返回该元素。定义了,正则表达式匹配也一样 但是,如果确实希望将数组截断为任意数,则可以执行以下操作:
@array = @array[0..4]
您所做的不仅仅是在代码中删除数组的元素 无论如何,您希望删除一个连续的数组元素范围:
say join ',', grep { defined } @array;
拼接@阵列,4,6;
您所做的不仅仅是在代码中删除数组的元素 无论如何,您希望删除一个连续的数组元素范围:
say join ',', grep { defined } @array;
拼接@阵列,4,6;
从以下数组开始:
my @array = 1..10;
现在您有了一个包含10个元素的数组
12345678910
在下一步中,执行一个数组切片,然后将其分配给另一个数组切片:
@array[0..3] = @array[5..8];
这将保留5到8之间的元素,但会将它们的值列表指定给0到3之间的元素,因此最终会出现一些重复的元素:
say join ',', grep { defined } @array;
67895678910
现在,您希望除去索引4之后的所有内容。您可以尝试使用另一个列表分配:
@array[4..10] = ();
但是,这只是将右侧的列表分配给右侧的列表。与任何列表分配一样,左侧元素从右侧列表中获取相应的元素。如果右侧列表中没有足够的元素,Perl将对其余右侧元素使用undef。这就是为什么@array中仍然有10个元素:
6 7 8 9未定义未定义未定义未定义未定义未定义
如果希望4作为最后一个索引,可以将其指定给数组的最后一个索引。指定的任何数字都将成为最后一个索引,可以缩短或扩展数组。由于要删除元素4及以上,可以将最后一个索引设置为3,即要删除的索引之前的索引:
$#array = 3;
现在已将数组截断为四个元素:
say join ',', grep { defined } @array;
6789
也可以使用拼接来执行此操作,拼接将替换阵列的一部分:
splice @array, $start_index, $length, @replacement;
您可以使用起始索引来计算长度,因为您希望一直到结束。然后,将该部分数组替换为空列表,这样可以有效地缩短数组:
my $start = 4;
splice @array, $start, @array - $start, ();
删除替换列表与删除空列表相同:
splice @array, $start, @array - $start;
当你想在中间移除零件时,这就更方便了。这将删除从索引4开始的三个元素,因此在末尾将有剩余的内容:
splice @array, 4, 3;
现在,您的阵列包含位于阵列开头和结尾的元素:
6,7,8,9,8,9,10
在不缩短阵列的情况下
还有另一种问题。您不想更改数组,但不想处理空字段。您可以使用grep仅选择已定义的元素:
say join ',', grep { defined } @array;
如果在数组的中间有未定义的元素,如果您希望列正确对齐,这可能是个问题。移除中间的列会移动其他列。不过你可能不在乎
类似地,您可以将未定义的值转换为对问题有意义的值。映射可以检查值并决定将其传递或转换。在本例中,未定义值变为0: 6,7,8,9,0,0,0,0,0,0,0 或空:say join ',', map { defined ? $_ : 'NULL' } @array;
6,7,8,9,空,空,空,空,空,空,空
或者干脆不定义为字符串:
say join ',', map { defined ? $_ : 'undef' } @array;
6,7,8,9,未定义,未定义,未定义,未定义,未定义,未定义,未定义
有时这些很方便,可以看到发生了什么
map可以像grep一样过滤数组。使用空列表从映射中不传递任何元素:
从以下数组开始:
my @array = 1..10;
现在您有了一个包含10个元素的数组
12345678910
在下一步中,执行一个数组切片,然后将其分配给另一个数组切片:
@array[0..3] = @array[5..8];
这样就不用考虑从5到8的元素,但会创建一个列表
将其值指定给0到3之间的元素,因此最终会出现一些重复的元素:
say join ',', grep { defined } @array;
67895678910
现在,您希望除去索引4之后的所有内容。您可以尝试使用另一个列表分配:
@array[4..10] = ();
但是,这只是将右侧的列表分配给右侧的列表。与任何列表分配一样,左侧元素从右侧列表中获取相应的元素。如果右侧列表中没有足够的元素,Perl将对其余右侧元素使用undef。这就是为什么@array中仍然有10个元素:
6 7 8 9未定义未定义未定义未定义未定义未定义
如果希望4作为最后一个索引,可以将其指定给数组的最后一个索引。指定的任何数字都将成为最后一个索引,可以缩短或扩展数组。由于要删除元素4及以上,可以将最后一个索引设置为3,即要删除的索引之前的索引:
$#array = 3;
现在已将数组截断为四个元素:
say join ',', grep { defined } @array;
6789
也可以使用拼接来执行此操作,拼接将替换阵列的一部分:
splice @array, $start_index, $length, @replacement;
您可以使用起始索引来计算长度,因为您希望一直到结束。然后,将该部分数组替换为空列表,这样可以有效地缩短数组:
my $start = 4;
splice @array, $start, @array - $start, ();
删除替换列表与删除空列表相同:
splice @array, $start, @array - $start;
当你想在中间移除零件时,这就更方便了。这将删除从索引4开始的三个元素,因此在末尾将有剩余的内容:
splice @array, 4, 3;
现在,您的阵列包含位于阵列开头和结尾的元素:
6,7,8,9,8,9,10
在不缩短阵列的情况下
还有另一种问题。您不想更改数组,但不想处理空字段。您可以使用grep仅选择已定义的元素:
say join ',', grep { defined } @array;
如果在数组的中间有未定义的元素,如果您希望列正确对齐,这可能是个问题。移除中间的列会移动其他列。不过你可能不在乎
类似地,您可以将未定义的值转换为对问题有意义的值。映射可以检查值并决定将其传递或转换。在本例中,未定义值变为0: 6,7,8,9,0,0,0,0,0,0,0 或空:say join ',', map { defined ? $_ : 'NULL' } @array;
6,7,8,9,空,空,空,空,空,空,空
或者干脆不定义为字符串:
say join ',', map { defined ? $_ : 'undef' } @array;
6,7,8,9,未定义,未定义,未定义,未定义,未定义,未定义,未定义
有时这些很方便,可以看到发生了什么
map可以像grep一样过滤数组。使用空列表从映射中不传递任何元素: