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
アルファ+ブラボー+チャーリー+デルタ+エコー+デルタ
フー+フード
樹皮+箱舟

これで、 splitsplit /[+]/, $sの最初の引数が pattern であるため、文字列を分割し、重複のシーケンスを持たないようにすることができます。

于 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 に答える