perl如何刪除數組元素


在數組中刪除元素,除了可以用shift pop等處理一些特殊位置的數據,一般位置用undef $_等是不行的,雖然值不存在了,但index依然占用位置。

比如說: @array = ('ray', 'loca', 'simon', 'ray'); 這里,我們想刪除‘ray’這個元素。

用下面的方法: foreach (@array){ if ($_ eq ray){ #undef $_; #$_=''; } } foreach(@array){ print $_."ok\n";
} 可以證明無論是undef還是''都是不行的,位置依然存在。

下面列出幾種可行的方法: 1. 用grep函數。

函數名 grep
調用語法 @foundlist = grep (pattern, @searchlist);
解說 與同名的UNIX查找工具類似,grep函數在列表中抽取與指定模式匹配的元素,參數pattern為欲查找的模式,返回值是匹配元素的列表。
例子 @list = ("This", "is", "a", "test"); @foundlist = grep(/^[tT]/, @list);
結果 @foundlist = ("This", "test");

2. 用map函數

函數名 map
調用語法 @resultlist = map (expr, @list);
解說 此函數在Perl5中定義,可以把列表中的各個元素作為表達式expr的操作數進行運算,其本身不改變,結果作為返回值。在表達式expr中,系統變量$_代表各個元素。
例子 1、@list = (100, 200, 300); @results = map ($_+1, @list); 2、@results = map (&mysub($_), @list);
結果 1、(101, 201, 301) 2、無

3. 用splice或者delete

函數名 splice
調用語法 @retval = splice (@array, skipelements, length, @newlist);
解說 拼接函數可以向列表(數組)中間插入元素、刪除子列表或替換子列表。參數skipelements是拼接前跳過的元素數目,length是被替換的元素數,newlist是將要拼接進來的列表。當newlist的長度大於length時,后面的元素自動后移,反之則向前縮進。因此,當length=0 時,就相當於向列表中插入元素,而形如語句 splice (@array, -1, 0, "Hello"); 則向數組末尾添加元素。而當newlist為空時就相當於刪除子列表,這時,如果length為空,就從第skipelements個元素后全部刪除,而刪除最后一個元素則為:splice (@array, -1);這種情況下,返回值為被刪去的元素列表

兩者都可以按照index直接刪除array或者hash的元素。但是delete刪除元素后, index后面的元素並不會 主動往前移動,該元素刪除后,在array還留有一個undef的元素,顯然刪除得不夠干凈。
下面用個小程序說明具體操作:

 

#!/usr/bin/perl


use strict;
use warnings;

my @array = ('ray', 'loca', 'simon', 'ray');
my $wanted = 'ray';

print "***show howto delete elements from array***\n\n";
print "Old array is @array\n";

# Method One: using grep

@array = grep { $_ ne "$wanted" } @array;
print "Now array is @array\n";

# Method Two: using map

@array = ('ray', 'loca', 'simon', 'ray');
# Function: if the the input string isn't the wanted string
# return the input string.
sub my_print
{
my ( $input, $wanted ) = @_;
return $input if ( $input ne $wanted );
}
@array = map { my_print($_, "$wanted") } @array;
print "Now array is @array\n";

# Method Three: using splice or delete
@array = ('ray', 'loca', 'simon', 'ray');
# The position of first "ray" is 0
splice (@array, 0, 1);
print "Now array is @array\n";
# The position of first "ray" is 2

splice @array, 2, 1;
print "Now array is @array\n";

程序運行結果為:

[ray@localhost perl]$ ./array_ops.pl
***show howto delete
elements from array***

Old array is ray loca simon ray
Now array is
loca simon
Now array is loca simon
Now array is loca simon ray
Now
array is loca simon

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM