- 締切済み
Perlで文字列の中で重複しているグループ排除等
サイトで探してもみつからないためこちらで質問します。 タイトルの通り、どのようにしたら重複を排除するか教えてください。 また、半角に限らず全角も排除できるような方法があればそれも教えてください。 たとえば、以下のソースを例に示します。 ------------------ #!/usr/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; my $buf1, $buf2, $buf3, $buf4; $buf1 = 'aabbccdd'; $buf2 = 'ああいいううええ'; $buf3 =~ tr///cs; $buf4 =~ tr///cs; print $buf1 . '->' . $buf3, "\n"; print $buf2 . '->' . $buf4, "\n"; #end ------------------ 上記の方法は、aabbccddをabcd、ああいいううええをあいうえにするといった重複排除のつもりでしたが、結果は以下の通り ------------------ aabbccdd->abcd ああいいうう->ああいいうう ------------------ 半角だとうまくいきますが、全角だとうまくいきません。これは基本的にJCodeなど 絡めて処理する必要があるのでしょうか。 また、「あいうえあいうえ」を「あいうえ」のひとつにする方法もわかりません。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- junpecho
- ベストアンサー率9% (1/11)
こんなのどうでしょう! # 2byteと文字と仮定しますね! my $str = 'ああいいううええ'; my $len = length($str); my $hash = (); for ( my $cnt = 0; $cnt < $len - 1; $cnt=$cnt+2 ){ my $tmp = substr( $str, $cnt, 2 ); my $hash->{"$tmp"} = $cnt; } foreach my $key ( sort { $hash->{$a} <=> $hash->{$b} } ( keys ( %$hash ) ) ){ print "$key,"; }
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず, 使っている Perl のバージョンはどうなっていますか? cgi-lib.pl とか jcode.pl を使うくらい超古いバージョンだと, いろいろと支障がありそうな気がするんですが. あと, 実は何をしたいのかもよくわかりません. そのコードでなんでそんな結果になるのか想像もつきませんし, 「あいうえあいうえ」を「あいうえ」のひとつにする というのもどういう処理を想定しているのかが分かりません. これだけなら s/^(.*)\K\1$//; で落とせそうな気がするんですが, 「重複している『グループ』排除『等』」では曖昧すぎて何を意図しているのかが読み取れません.
補足
Perlのバージョンは v5.14.2です。 実際はブラウザによってはコピーペーストするときに、ときどき同じ名称が重複してでてくることがあります。ツールにそれをペーストするときにエラーがでるので、いちいち消さなくてはなりません。それをなくすためにそういった文字列をPerlで正規表現を駆使してやろうとおもったのがきっかけです。 残念ながら、提示していただいたコードでは重複の解消にはなりませんでした。