次のように読み取る文字列があります。
a+c+c+b+v+f+d+d+d+c
で分割して+
重複を削除するようにプログラムを作成する必要があるため、出力は次のようになります。
acbvfdc
使ってみtr///cs;
たけど使ってないのかな?
次のように読み取る文字列があります。
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 アルファ+ブラボー+チャーリー+デルタ+エコー+デルタ フー+フード 樹皮+箱舟
これで、 splitsplit /[+]/, $s
の最初の引数が pattern であるため、文字列を分割し、重複のシーケンスを持たないようにすることができます。
読む人への注意:これは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;
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