大小写转换-Perl,使用tr函数将大写字母转换为小写字母,反之亦然



我有一个字符串

$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带圆圈的拉丁文小写字母AAFF21全角拉丁文大写字母AaFF41全角拉丁文小写字母AⒸ 24B8带圆圈的拉丁文大写字母Cⓒ 24D2带圆圈的拉丁文小写字母CDZ01F1拉丁文大写字母DZDz01F2拉丁文大写字母D随以小写字母Zdz01F3拉丁文小写字母DZⅲ2172小罗马数字三S 0053拉丁文大写字母Ss 0073拉丁文小写字母sſ017F拉丁文小写字母LONG S⒮24AE带括号的拉丁文小写字母SⓈ 24C8带圆圈的拉丁文大写字母Sⓢ 24E2带圆圈的拉丁文小写字母SꞄA784拉丁文大写字母insula SꞅA785拉丁文小写字母insula Sß00DF拉丁文小写字母SHARP Sẞ1E9E拉丁文大写字母SHARP SⅦ2166罗马数字七ⅻ217B小写罗马数字十二

它会产生以下结果:

@0040商业©00a9版权标志å212b埃符号⒜249c带括号的拉丁文小写字母aⓐ 24b6带圆圈的拉丁文大写字母aⒶ 24d0带圆圈的拉丁文小写字母aaff21全角拉丁文大写字母aAff41全角拉丁文小写字母aⓒ 24b8带圆圈的拉丁文大写字母cⒸ 24d2带圆圈的拉丁文小写字母cdz01f1拉丁文大写字母dzdz01f2拉丁文大写字母d,带小写字母zDZ01f3拉丁文小写字母dzⅢ2172小写罗马数字三s 0053拉丁文大写字母sS 0073拉丁文小写字母SS 017f拉丁文小写字母long S⒮24ae带括号的拉丁文小写字母sⓢ 24c8带圆圈的拉丁文大写字母sⓈ 24e2带圆圈的拉丁文小写字母sꞅa784拉丁文大写字母insula sꞄa785拉丁文小写字母insula sSS 00df拉丁文小写字母尖sß1e9e拉丁文大写字母sharp sⅶ2166罗马数字7十二217b小写罗马数字十二

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

dz01f1拉丁文大写字母dzDZ01f2拉丁文大写字母d随以小写字母zDZ01f3拉丁文小写字母dz

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

ª00AA女性序数指示符ᴬ1D2C修饰字母大写Aᴀ1D00拉丁文字母小型大写Aℂ2102双结构大写Cᴰ1D30修饰字母大写Dʣ02A3拉丁文小写字母DZ有向图ʤ02A4拉丁文小写字母DEZH有向图ℇ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双层小圆周率

所以你会检测到它们是大写或小写的,然后调用反向映射函数,然后发现什么都没有改变。我想,为什么要麻烦?

最新更新