Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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
Arrays Perl:如何从没有空格的数组中删除元素_Arrays_Perl - Fatal编程技术网

Arrays Perl:如何从没有空格的数组中删除元素

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,,,,,,, 如何删除多余的,我假设这是一个家庭作业问题,因为如果不是这样的话,你会用这段代码做一些非常奇怪的事情 但是让我们来解决这个问题——过滤数组

如何从索引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,,,,,,,

如何删除多余的,

我假设这是一个家庭作业问题,因为如果不是这样的话,你会用这段代码做一些非常奇怪的事情

但是让我们来解决这个问题——过滤数组最简单的方法是使用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一样过滤数组。使用空列表从映射中不传递任何元素: