美好的一天,
我在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,
COSON
答案 0 :(得分: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
答案 1 :(得分: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///
运算符的替换部分。
答案 2 :(得分:-4)
\L
表示"lowercase till \E
";即,\E
需要在某个时刻跟踪它。您的正则表达式中没有\E
,因此它无效;在每个\E
之后添加\L
得到要编译的脚本,但我不知道你实际上想要在那里完成什么。