我有我讀喜歡的字符串:在Perl中,如何用數組中的一個元素替換重複序列?
a+c+c+b+v+f+d+d+d+c
我需要的,因此在分割的+
寫程序,然後刪除重複的,因此輸出爲:
acbvfdc
我已經嘗試tr///cs;
,但我想我沒有正確使用它?
我有我讀喜歡的字符串:在Perl中,如何用數組中的一個元素替換重複序列?
a+c+c+b+v+f+d+d+d+c
我需要的,因此在分割的+
寫程序,然後刪除重複的,因此輸出爲:
acbvfdc
我已經嘗試tr///cs;
,但我想我沒有正確使用它?
#!/usr/bin/env perl
use strict; use warnings;
my @strings = qw(
a+c+c+b+v+f+d+d+d+c
alpha+bravo+bravo+bravo+charlie+delta+delta+delta+echo+delta
foo+food
bark+ark
);
for my $s (@strings) {
# Thanks @ikegami
$s =~ s/ (?<![^+]) ([^+]+) \K (?: [+] \1)+ (?![^+]) //gx;
print "$s\n";
}
輸出:現在
a+c+b+v+f+d+c alpha+bravo+charlie+delta+echo+delta foo+food bark+ark
,可以分割字符串,並且沒有使用split /[+]/, $s
重複的序列,因爲的split第一個參數是一個圖案。
任何人都會注意到:這並沒有直接解決OP的問題,儘管在我的辯護中,這個問題措辭含糊不清。 :-)儘管如此,它回答了其他人可能具有的問題的解釋,所以我會保持原樣。
命令是否重要?如果沒有,你可以嘗試這樣的事:
use strict;
use warnings;
my $string = 'a+c+c+b+v+f+d+d+d+c';
# Extract unique 'words'
my @words = keys %{{map {$_ => 1} split /\+/, $string}};
print "$_\n" for @words;
更重要的是,使用List :: MoreUtils從CPAN(其中不保留順序):
use strict;
use warnings;
use List::MoreUtils 'uniq';
my $string = 'a+c+c+b+v+f+d+d+d+c';
# Extract unique 'words'
my @words = uniq split /\+/, $string;
print "$_\n" for @words;
這將它分開,但我需要它只在刪除重複項時纔會刪除重複項。 – user1328009 2012-04-12 03:19:49
啊,我不太清楚你的原始問題。謝謝。 – 2012-04-12 03:31:36
my $s="a+c+c+b+v+f+d+d+d+c";
$s =~ tr/+//d;
$s =~ tr/\0-\xff/\0-\xff/s;
print "$s\n"; # => acbvfdc
這在這種特殊情況下可以工作,但它不是通用的情況,其中元素不是單個字符以外的任何元素和/或元素包含超出「a-z」範圍的任何東西。 – 2012-04-12 03:55:21
@SinanÜnür好吧,OP肯定暗示有問題的是個人角色,並且他會對tr //解決方案感興趣。可以用'$ s =〜tr/\ 0- \ xff/\ 0- \ xff/s;'概括爲ascii而不是a-z。 – dbenhur 2012-04-12 04:04:09
我把這個到我的代碼(我不知道如何在這裏發佈),它刪除了重複,但現在當我嘗試在「+」分裂它告訴我,「量詞在正則表達式中沒有任何東西」,並停止程序從運行。 – user1328009 2012-04-12 03:25:59
'+'在正則表達式中很特殊。你要麼逃避它,要麼把它放在一個字符類中(正如我在上面的///中所做的那樣)。 – 2012-04-12 03:52:33
好的,謝謝!我得到它的工作 – user1328009 2012-04-12 04:04:31