0

分割文字を取得したい。以下のコーディングを試しましたが、分割されたテキストしか取得できません。ただし、分割文字が同じ場合は、その単一の文字として返される必要があります。たとえば、文字列が「asa,agas,asa」の場合、, のみが返されます。したがって、以下の場合、「| : ;」として取得する必要があります (スペースで結合)

use strict;
use warnings;

my $str = "Welcome|a:g;v";
my @value = split /[,;:.%|]/, $str;

foreach my $final (@value) {
    print $final, "\n";
}
4

5 に答える 5

2

splitそれらの要素を区切るものが与えられたときに文字列を要素に分割するのでsplit、あなたが望むものではありません。代わりに、次を使用します。

my @punctuations = $str =~ /([,;:.%|])/g;
于 2013-02-22T13:18:36.977 に答える
0

すべてのセパレーターを 1 回だけ抽出するには、もっと手の込んだものが必要です

my @punctuations = keys %{{ map { $_ => 1 } $str =~ /[,;:.%|]/g }};
于 2013-02-22T20:26:07.073 に答える
0

したがって、分割の反対を取得したい

試す:

my @value=split /[^,;:.%|]+/,$str;

設定した区切り文字以外で分割されます。

コメント後の訂正:

my @value=split /[^,;:.%|]+/,$str;
shift @value;
于 2013-02-22T13:16:43.717 に答える
0

私たちが「区切り文字」と呼んでいるものを「分割文字」と呼んでいるように聞こえます-もしそうなら、POSIX文字クラス[:punct:]は価値があるとわかるかもしれません。

OTOH、区切り文字のリストが定義されていて、文字列に存在するものをリストするだけでよい場合m//は、split.

于 2013-02-23T02:09:09.903 に答える
0

これはうまく機能し、ユニークな答えが得られます

@value = ();
foreach(split('',",;:.%|")) { push @value,$_ if $str=~/$_/; }
于 2013-02-22T13:35:46.623 に答える