我有一个字符串
$string= 'AbCdEf';
我想使用 tr 函数将所有大写字母转换为小写字母,并将所有小写字母转换为大写字母....同时。我基本上只是想把它倒过来变成。
aBcDeF
我想出了这条线,但我不知道如何修改它来做我想要的。请问有什么帮助吗?
$string=~ tr/A-Z/a-z/;
谢谢!
我有一个字符串
$string= 'AbCdEf';
我想使用 tr 函数将所有大写字母转换为小写字母,并将所有小写字母转换为大写字母....同时。我基本上只是想把它倒过来变成。
aBcDeF
我想出了这条线,但我不知道如何修改它来做我想要的。请问有什么帮助吗?
$string=~ tr/A-Z/a-z/;
谢谢!
应 Tom 的要求,Unicode-clean(或 locales-clean)版本:
s/([[:upper:]])|([[:lower:]])/defined $1 ? lc $1 : uc $2/eg
$string =~ tr/A-Za-z/a-zA-Z/;
您可以通过以下方式执行完整的 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 双头小派
所以你会检测到它们是大写还是小写,然后调用逆映射函数,然后发现什么都没有改变。我想,为什么要打扰?