1

良い一日、

私はPerlで2つの単語を交換する簡単な作業ルーチンを持っています:

すなわちJohnDoe-----> Doe John

ここにあります:

sub SwapTokens()
{
    my ($currentToken) = @_;

    $currentToken =~ s/([A-Za-z]+) ([A-Za-z]+)/$2 $1/;
    # $currentToken =~ s/(\u\L) (\u\L)/$2 $1/;
    return $currentToken;
} 

次の使用法は、まさに私が望むものを生み出します:

print &SwapTokens("John Doe");

しかし、行のコメントを外すと、'$ currentToken =〜s /(\ u \ L)(\ u \ L)/ $ 2 $ 1 /;

エラーが発生します。何かが足りないのですが、構文が正しいようです。

TIA、

コソン

4

3 に答える 3

5

\u大文字と一致する正規表現アトムではありません。\L小文字の数に一致する正規表現アトムではありません。あなたが探しています

s/(\p{Lu}\p{Ll}+) (\p{Lu}\p{Ll}+)/$2 $1/;

\p{Lu}  Uppercase letter.
\p{Ll}  Lowercase letter.

$ unichars '\p{Lu}' | head -n 5
 A  U+0041 LATIN CAPITAL LETTER A
 B  U+0042 LATIN CAPITAL LETTER B
 C  U+0043 LATIN CAPITAL LETTER C
 D  U+0044 LATIN CAPITAL LETTER D
 E  U+0045 LATIN CAPITAL LETTER E

$ unichars '\p{Ll}' | head -n 5
 a  U+0061 LATIN SMALL LETTER A
 b  U+0062 LATIN SMALL LETTER B
 c  U+0063 LATIN SMALL LETTER C
 d  U+0064 LATIN SMALL LETTER D
 e  U+0065 LATIN SMALL LETTER E
于 2012-06-18T22:14:56.563 に答える
5

おそらくあなたはこのようなものを探しています:

sub swap_the_words {
  my ($processed_string) = @_;
  $processed_string =~ s/([A-Z][A-Za-z]+) ([A-Z][A-Za-z]+)/$2 $1/;
  return $processed_string;
}
print swap_the_words('John Doe'); # prints Doe John

\uとについては、正規表現ではなく、文字列\lの変更に適しています。たとえば、スクリプトをそのように少し変更することができます...

  $processed_string =~ s/([a-z]+) ([a-z]+)/\u\L$2\E \u\L$1\E/i;
  ...
  print swap_the_words('cOsOn hAcKeR'); # Hacker Coson

...だから、あなたの言葉は交換されるだけでなく、適切なケースも与えられます。ただし、これらの修飾子は、s///演算子の置換部分で使用されることに注意してください。

于 2012-06-18T22:16:36.750 に答える
-4

\L「小文字まで\Eを意味します; つまり、ある時点で。が続く必要があります\E\E正規表現がないため、無効です。\Eそれぞれの後に追加する\Lと、スクリプトがコンパイルされますが、実際にそこで何を達成しようとしているのかはわかりません。

于 2012-06-18T22:02:40.100 に答える