1

再会,

我在 Perl 中有一个简单的工作例程,可以交换两个单词:

即 John Doe -----> 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

至于\uand \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 回答