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

Bri*_*ian 10 perl case-conversion

我有一个字符串

$string= 'AbCdEf';
Run Code Online (Sandbox Code Playgroud)

我想使用tr函数将所有大写字母转换为小写字母,将所有小写字母转换为大写字母....同时.我基本上只想扭转它成为.

aBcDeF
Run Code Online (Sandbox Code Playgroud)

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

$string=~ tr/A-Z/a-z/;
Run Code Online (Sandbox Code Playgroud)

谢谢!

hob*_*bbs 14

在Tom的请求下,Unicode-clean(或locales-clean)版本:

s/([[:upper:]])|([[:lower:]])/defined $1 ? lc $1 : uc $2/eg
Run Code Online (Sandbox Code Playgroud)


fri*_*edo 12

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

  • 当有人说"全部大写"时,他们要求的是`\ p {Upper},而不是`[AZ]`.与"全部小写"类似,他们要求"\ p {Lower}"而不是"[az]".az和AZ都有*代码气味*:"它们总是错误的 - 有时候."我讨厌保证有时候会更加小心谨慎可以保证我永远不会错.这就像在一个非常小的比赛条件和完全没有比赛条件之间存在着天壤之别.细心的程序员知道这两种情况中只有一种是正确的,所以**总是**避免另一种情况. (8认同)
  • 是的,什么是现代解决方案,一个没有陷入7位ᴀsᴄɪɪ的解决方案?:) (4认同)

tch*_*ist 7

您可以这样做完整的Unicode解决方案:

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

或者这样

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

取决于你想要做什么来改变两个方向的情况,比如Dz,其大写字母是DZ,小写字母是dz.

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

     @   0040  COMMERCIAL AT
     ©   00A9  COPYRIGHT SIGN
     Å   212B  ANGSTROM SIGN
     ?   249C  PARENTHESIZED LATIN SMALL LETTER A
     ?   24B6  CIRCLED LATIN CAPITAL LETTER A
     ?   24D0  CIRCLED LATIN SMALL LETTER A
     ?  FF21  FULLWIDTH LATIN CAPITAL LETTER A
     ?  FF41  FULLWIDTH LATIN SMALL LETTER A
     ?   24B8  CIRCLED LATIN CAPITAL LETTER C
     ?   24D2  CIRCLED LATIN SMALL LETTER C
     ?   01F1  LATIN CAPITAL LETTER DZ
     ?   01F2  LATIN CAPITAL LETTER D WITH SMALL LETTER Z
     ?   01F3  LATIN SMALL LETTER DZ
     ?   2172  SMALL ROMAN NUMERAL THREE
     S   0053  LATIN CAPITAL LETTER S
     s   0073  LATIN SMALL LETTER S
     ?   017F  LATIN SMALL LETTER LONG S
     ?   24AE  PARENTHESIZED LATIN SMALL LETTER S
     ?   24C8  CIRCLED LATIN CAPITAL LETTER S
     ?   24E2  CIRCLED LATIN SMALL LETTER S
     ?   A784  LATIN CAPITAL LETTER INSULAR S
     ?   A785  LATIN SMALL LETTER INSULAR S
     ß   00DF  LATIN SMALL LETTER SHARP S
     ?   1E9E  LATIN CAPITAL LETTER SHARP S
     ?   2166  ROMAN NUMERAL SEVEN
     ?   217B  SMALL ROMAN NUMERAL TWELVE

它会产生以下结果:

     @   0040  commercial at
     ©   00a9  copyright sign
     å   212b  angstrom sign
     ?   249c  parenthesized latin small letter a
     ?   24b6  circled latin capital letter a
     ?   24d0  circled latin small letter a
     ?  ff21  fullwidth latin capital letter a
     ?  ff41  fullwidth latin small letter a
     ?   24b8  circled latin capital letter c
     ?   24d2  circled latin small letter c
     ?   01f1  latin capital letter dz
     ?   01f2  latin capital letter d with small letter z
     ?   01f3  latin small letter dz
     ?   2172  small roman numeral three
     s   0053  latin capital letter s
     S   0073  latin small letter s
     S   017f  latin small letter long s
     ?   24ae  parenthesized latin small letter s
     ?   24c8  circled latin capital letter s
     ?   24e2  circled latin small letter s
     ?   a784  latin capital letter insular s
     ?   a785  latin small letter insular s
     SS   00df  latin small letter sharp s
     ß   1e9e  latin capital letter sharp s
     ?   2166  roman numeral seven
     ?   217b  small roman numeral twelve

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

     ?   01f1  latin capital letter dz
     ?   01f2  latin capital letter d with small letter z
     ?   01f3  latin small letter dz

你不想只使用上限或下限测试的原因是因为你做了不必要的工作,因为有很多套管代码点在casemapped时不会改变大小写.例如,所有这些都是套管代码点,但在大写时和小写时都不会改变:

     ª   00AA FEMININE ORDINAL INDICATOR
     ?   1D2C MODIFIER LETTER CAPITAL A
     ?   1D00 LATIN LETTER SMALL CAPITAL A
     ?   2102 DOUBLE-STRUCK CAPITAL C
     ?   1D30 MODIFIER LETTER CAPITAL D 
     ?   02A3 LATIN SMALL LETTER DZ DIGRAPH
     ?   02A4 LATIN SMALL LETTER DEZH DIGRAPH
     ?   2107 EULER CONSTANT
     ?   0258 LATIN SMALL LETTER REVERSED E
     ?   025E LATIN SMALL LETTER CLOSED REVERSED OPEN E
     ?   210A SCRIPT SMALL G
     ?   0261 LATIN SMALL LETTER SCRIPT G
     ?   0262 LATIN LETTER SMALL CAPITAL G
     ?   02B0 MODIFIER LETTER SMALL H
     ?   210B SCRIPT CAPITAL H
     ?   210E PLANCK CONSTANT 
     ?   2139 INFORMATION SOURCE
     ?   02B2 MODIFIER LETTER SMALL J
     ?   2133 SCRIPT CAPITAL M
     º   00BA MASCULINE ORDINAL INDICATOR
     ?   0278 LATIN SMALL LETTER PHI
     ?   0138 LATIN SMALL LETTER KRA
     ?   028F LATIN LETTER SMALL CAPITAL Y
     ?   213C DOUBLE-STRUCK SMALL PI

所以你会发现它们是大写或小写,然后调用逆映射函数,然后发现没有任何改变.我想,为什么要这么麻烦?