我正在嘗試洗掉陣列中兩次相同的值,它背靠背放置,這是我的代碼
@{$tmp_h->{'a'}} = qw/A B B C/;
print Dumper ($tmp_h);
my $j = 0;
foreach my $cur (@{$tmp_h->{'a'}}) {
if ($cur eq 'B') {
splice(@{$tmp_h->{'a'}}, $j, 1);
}
$j ;
}
print Dumper $tmp_h;
然而得到的是,
$VAR1 = {
'a' => [
'A',
'B',
'B',
'C'
]
};
$VAR1 = {
'a' => [
'A',
'B',
'C'
]
};
我希望在這種情況下洗掉兩個“B”,可能出了什么問題?
uj5u.com熱心網友回復:
該代碼在遍歷陣列時從陣列中洗掉,從下面拉出地毯;有必要嗎?
相反,如果相鄰的元素不相等,則迭代并將元素放在另一個陣列上。所以迭代索引,仔細查找一個元素和下一個(或上一個)元素。?
我認為這B只是一個例子,而實際上它可以是任何值,等于它的相鄰值。
但有趣的是,正則運算式也可以提供幫助,它使用反向參考來定位重復模式的簡單方法
my @ary = qw(a b b c d d e f f f g);
my $str_ary = join '', @ary;
$str_ary =~ s/(.)\g{-1}//g;
my @new_ary = split //, $str_ary;
say "@new_ary"; #--> a c e f g
這僅洗掉了一對相鄰值,因此如果有奇數個相等的相鄰值,它會留下奇數個(f如上)。出于好奇,它可以寫在一個陳述句中
my @new_ary = split //, join('', @ary) =~ s/(.)\g{-1}//gr;
join形成字串的-ed 陣列系結到替換運算子,其中/r修飾符至關重要,以允許這樣做并回傳更改后的字串,然后將其拆分回串列中。
但單字母元素可能只是一個例子。一般來說,我們必須將元素與元素中不能存在的東西連接起來,這顯然是一個棘手的命題。合理的選擇可以是換行,因為人們可以期望知道元素是/不是多行字串
my @ary = qw(aa no no way bah bah bah go);
my $str_ary = join "\n", @ary ;
$str_ary =~ s/([^\n] )\n\g{-1}//g;
my @new = grep { $_ } split /\n/, $str_ary;
say "@new"; #--> aa way bah go
這仍然會有帶有有趣元素的邊緣情況,例如空格和空字串(但任何方法都會)。
? 例如
use warnings;
use strict;
use feature 'say';
my @ary = qw(a b b c d d e f f f g);
my @new_ary;
my $i = 0;
while ( $i <= $#ary) {
if ($ary[$i] ne $ary[$i-1]) {
push @new_ary, $ary[$i-1]
}
else { $i }
}
push @new_ary, $ary[-1] if $ary[-1] ne $ary[-2];
say "@new_ary"; #--> a c e f g
uj5u.com熱心網友回復:
Perl 檔案在Foreach Loops下的perlsyn 中告訴您:
如果 LIST 的任何部分是一個陣列,
foreach如果在回圈體中添加或洗掉元素,例如使用splice. 所以不要那樣做。
您可以改為迭代索引,但不要忘記在洗掉值時不要增加索引:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
my $tmp_h = {a => [qw[ A B B C ]]};
print Dumper($tmp_h);
my $j = 0;
while ($j <= $#{ $tmp_h->{a} }) {
my $cur = $tmp_h->{a}[$j];
if ($cur eq 'B') {
splice @{ $tmp_h->{a} }, $j, 1;
} else {
$j;
}
}
print Dumper($tmp_h);
或者從右邊開始,這樣您就不必擔心:
my $j = $#{ $tmp_h->{a} };
while ($j-- >= 0) {
my $cur = $tmp_h->{a}[$j];
splice @{ $tmp_h->{a} }, $j, 1 if $cur eq 'B';
}
但最直接的方法是使用grep:
@{ $tmp_h->{a} } = grep $_ ne 'B', @{ $tmp_h->{a} };
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/329321.html
