在Perl中,如何用数组中的一个元素替换重复序列?

时间:2012-04-12 02:33:10

标签: arrays perl duplicate-removal

我读了一个字符串,如:

a+c+c+b+v+f+d+d+d+c

我需要编写程序,使其在+分割,然后删除重复项,输出为:

acbvfdc

我已经尝试tr///cs;,但我想我没有正确使用它?

3 个答案:

答案 0 :(得分: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的第一个参数是模式

答案 1 :(得分: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;

更好的是,使用CPAN中的List :: MoreUtils( 保留订单):

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;

答案 2 :(得分: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