Perl, используя функцию tr для преобразования прописных букв в строчные и наоборот? - PullRequest
10 голосов
/ 10 апреля 2011

У меня есть строка

$string= 'AbCdEf';

, и я хочу использовать функцию tr для преобразования всех заглавных букв в строчные и всех строчных в прописные .... одновременно.Я просто хочу изменить это, чтобы стать.

aBcDeF

Я придумал эту строку, но я не уверен, как изменить это, чтобы сделать то, что я хочу.Любая помощь, пожалуйста?

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

Спасибо!

Ответы [ 3 ]

14 голосов
/ 10 апреля 2011

По запросу Тома версия Unicode-clean (или locales-clean):

s/([[:upper:]])|([[:lower:]])/defined $1 ? lc $1 : uc $2/eg
12 голосов
/ 10 апреля 2011

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

7 голосов
/ 10 апреля 2011

Полное решение 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
     A  FF21  FULLWIDTH LATIN CAPITAL LETTER A
     a  FF41  FULLWIDTH LATIN SMALL LETTER A
     Ⓒ   24B8  CIRCLED LATIN CAPITAL LETTER C
     ⓒ   24D2  CIRCLED LATIN SMALL LETTER C
     DZ   01F1  LATIN CAPITAL LETTER DZ
     Dz   01F2  LATIN CAPITAL LETTER D WITH SMALL LETTER Z
     dz   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
     a  ff21  fullwidth latin capital letter a
     A  ff41  fullwidth latin small letter a
     ⓒ   24b8  circled latin capital letter c
     Ⓒ   24d2  circled latin small letter c
     dz   01f1  latin capital letter dz
     dz   01f2  latin capital letter d with small letter z
     DZ   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 будет выглядеть следующим образом:

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

Причина, по которой вы не хотите использовать только верхний или нижний тест, заключается в том, что тогда вы выполняете ненужную работу, поскольку существует множество кодированных точек в регистре, которые не меняют регистр при отображении регистра. Все это, например, кодированные точки в регистре, но они не изменяются ни в верхнем, ни в нижнем регистре:

     ª   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

Таким образом, вы обнаружите, что они прописные или строчные, затем вызовете функцию обратного отображения и обнаружите, что ничего не изменилось. Я думаю, зачем?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...