2012-04-12 58 views

回答

3
#!/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第一個參數是一個圖案

+0

我把這個到我的代碼(我不知道如何在這裏發佈),它刪除了重複,但現在當我嘗試在「+」分裂它告訴我,「量詞在正則表達式中沒有任何東西」,並停止程序從運行。 – user1328009 2012-04-12 03:25:59

+0

'+'在正則表達式中很特殊。你要麼逃避它,要麼把它放在一個字符類中(正如我在上面的///中所做的那樣)。 – 2012-04-12 03:52:33

+0

好的,謝謝!我得到它的工作 – user1328009 2012-04-12 04:04:31

1

任何人都會注意到:這並沒有直接解決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; 
+0

這將它分開,但我需要它只在刪除重複項時纔會刪除重複項。 – user1328009 2012-04-12 03:19:49

+0

啊,我不太清楚你的原始問題。謝謝。 – 2012-04-12 03:31:36

0
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 
+0

這在這種特殊情況下可以工作,但它不是通用的情況,其中元素不是單個字符以外的任何元素和/或元素包含超出「a-z」範圍的任何東西。 – 2012-04-12 03:55:21

+0

@SinanÜnür好吧,OP肯定暗示有問題的是個人角色,並且他會對tr //解決方案感興趣。可以用'$ s =〜tr/\ 0- \ xff/\ 0- \ xff/s;'概括爲ascii而不是a-z。 – dbenhur 2012-04-12 04:04:09

相關問題