10

我有一个字符串

$string= 'AbCdEf';

我想使用 tr 函数将所有大写字母转换为小写字母,并将所有小写字母转换为大写字母....同时。我基本上只是想把它倒过来变成。

aBcDeF

我想出了这条线,但我不知道如何修改它来做我想要的。请问有什么帮助吗?

$string=~ tr/A-Z/a-z/;

谢谢!

4

3 回答 3

14

应 Tom 的要求,Unicode-clean(或 locales-clean)版本:

s/([[:upper:]])|([[:lower:]])/defined $1 ? lc $1 : uc $2/eg
于 2011-04-09T21:39:05.643 回答
12

$string =~ tr/A-Za-z/a-zA-Z/;

于 2011-04-09T21:33:02.580 回答
7

您可以通过以下方式执行完整的 Unicode 解决方案:

    s/ (\p{CWU}) | (\p{CWL}) / 定义 $1 ?uc $1 : lc $2/gex;

或者这样

    s/ (\p{CWL}) | (\p{CWU}) / 定义 $1 ?lc $1 : uc $2/gex;

取决于你想对在两个方向上改变大小写的东西做什么,比如Dz,它的大写是DZ,它的小写是dz。

如果您在此输入中运行这两个替换中的第二个:

     @ 0040 商业在
     © 00A9 版权所有
     Å 212B 埃格斯特罗姆标志
     ⒜ 249C 带括号的拉丁文小写字母 A
     Ⓐ 24B6 带圆圈的拉丁文大写字母 A
     ⓐ 24D0 带圆圈的拉丁文小写字母 A
     一个 FF21 全宽拉丁文大写字母 A
     一个 FF41 全宽拉丁小写字母 A
     Ⓒ 24B8 带圆圈的拉丁文大写字母 C
     ⓒ 24D2 带圆圈的拉丁文小写字母 C
     DZ 01F1 拉丁文大写字母 DZ
     Dz 01F2 拉丁文大写字母 D 和小写字母 Z
     dz 01F3 拉丁文小写字母 DZ
     ⅲ 2172 小罗马数字三
     S 0053 拉丁文大写字母 S
     s 0073 拉丁文小写字母 S
     ſ 017F 拉丁文小写字母 LONG S
     ⒮ 24AE 带括号的拉丁文小写字母 S
     Ⓢ 24C8 带圆圈的拉丁文大写字母 S
     ⓢ 24E2 带圆圈的拉丁文小写字母 S
     Ꞅ A784 拉丁文大写字母 INSULAR S
     ꞅ A785 拉丁小写字母 INSULAR S
     ß 00DF 拉丁文小写字母 SHARP S
     ẞ 1E9E 拉丁文大写字母 SHARP S
     Ⅶ 2166 罗马数字七
     ⅻ 217B 小罗马数字十二

它产生以下结果:

     @ 0040 广告在
     © 00a9 版权标志
     å 212b 埃符号
     ⒜ 249c 带括号的拉丁文小写字母 a
     ⓐ 24b6 带圆圈的拉丁文大写字母 a
     Ⓐ 24d0 带圆圈的拉丁文小写字母 a
     a ff21 全角拉丁文大写字母 a
     A ff41 全角拉丁文小写字母 a
     ⓒ 24b8 带圆圈的拉丁文大写字母 c
     Ⓒ 24d2 带圆圈的拉丁文小写字母 c
     dz 01f1 拉丁文大写字母 dz
     dz 01f2 拉丁文大写字母 d 和小写字母 z
     DZ 01f3 拉丁文小写字母 dz
     Ⅲ 2172 小罗马数字三
     s 0053 拉丁文大写字母 s
     S 0073 拉丁文小写字母 s
     S 017f 拉丁文小写字母长 s
     ⒮ 24ae 带括号的拉丁文小写字母 s
     ⓢ 24c8 带圆圈的拉丁文大写字母 s
     Ⓢ 24e2 带圆圈的拉丁文小写字母 s
     ꞅ a784 拉丁文大写字母 insular s
     Ꞅ a785 拉丁文小写字母 insular s
     SS 00df 拉丁文小写字母 s
     ß 1e9e 拉丁文大写字母 s
     ⅶ 2166 罗马数字七
     Ⅻ 217b 小罗马数字十二

使用第一个函数(在该集合中)唯一不同的部分是 dz 序列将看起来像这样:

     dz 01f1 拉丁文大写字母 dz
     DZ 01f2 拉丁文大写字母 d 和小写字母 z
     DZ 01f3 拉丁文小写字母 dz

您不想只使用上限或下限测试的原因是因为您做了不必要的工作,因为有很多大小写代码点在大小写映射时不会改变大小写。例如,所有这些都是大小写的代码点,但无论是大写还是小写都不会改变:

     ª 00AA 女性序数指标
     ᴬ 1D2C 修饰字母大写 A
     ᴀ 1D00 拉丁字母小写字母 A
     ℂ 2102 大写字母 C
     ᴰ 1D30 修饰字母大写 D
     ʣ 02A3 拉丁文小写字母 DZ 图
     ʤ 02A4 拉丁文小写字母 DEZH DIGRAPH
     ℇ 2107 欧拉常数
     ɘ 0258 反转的拉丁文小写字母 E
     ɞ 025E 拉丁文小写字母 闭 反 开 E
     ℊ 210A 脚本小 G
     ɡ 0261 拉丁文小写字母脚本 G
     ɢ 0262 拉丁字母小写字母 G
     ʰ 02B0 修饰字母小 H
     ℋ 210B 脚本大写字母 H
     ℎ 210E 普朗克常数
     ℹ 2139 信息源
     ʲ 02B2 修饰字母小 J
     ℳ 2133 脚本大写字母 M
     º 00BA 阳性序数指标
     ɸ 0278 拉丁文小写字母 PHI
     ĸ 0138 拉丁文小写字母 KRA
     ʏ 028F 拉丁字母小写字母 Y
     ℼ 213C 双头小派

所以你会检测到它们是大写还是小写,然后调用逆映射函数,然后发现什么都没有改变。我想,为什么要打扰?

于 2011-04-09T22:32:54.773 回答