在數組中刪除元素,除了可以用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