0

我有一个我读过的字符串:

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

我需要编写程序,以便它拆分+然后删除重复项,因此输出为:

acbvfdc

我试过tr///cs;了,但我想我没有使用它对吗?

4

3 回答 3

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
阿尔法+布拉沃+查理+三角洲+回声+三角洲
美食+食物
树皮+方舟

现在,您可以使用拆分字符串并且没有重复序列,split /[+]/, $s因为拆分的第一个参数是模式

于 2012-04-12T02:39:48.877 回答
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;
于 2012-04-12T03:03:40.253 回答
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
于 2012-04-12T03:48:00.283 回答