我读了一个字符串,如:
a+c+c+b+v+f+d+d+d+c
我需要编写程序,使其在+
分割,然后删除重复项,输出为:
acbvfdc
我已经尝试tr///cs;
,但我想我没有正确使用它?
答案 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