10

私は文字列を持っています

$string= 'AbCdEf';

そして、tr関数を使用して、すべての大文字を小文字に変換し、すべての小文字を大文字に変換したいと思います。基本的には逆にしてなりたいです。

aBcDeF

私はこの行を思いついたが、私が望むことをするためにそれを変更する方法がわからない。何か助けてください?

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

ありがとう!

4

3 に答える 3

14

トムの要求に応じて、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})/ defined $ 1?uc $ 1:lc $ 2 / gex;

またはこのように

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

大文字がDZで小文字がdzであるDzのように、両方向で大文字と小文字を変更するもので何をしたいかによって異なります。

この入力全体でこれら2つの置換の2番目を実行する場合:

     @0040コマーシャルAT
     ©00A9著作権記号
     Å212BANGSTROMSIGN
     ⒜249CPARENTHESIZEDLATINSMALL LETTER A
     Ⓐ24B6CIRCLEDLATINCAPITAL LETTER A
     ⓐ24D0CIRCLEDLATINSMALL LETTER A
     A FF21 FULLWIDTH LATIN CAPITAL LETTER A
     FF41全幅ラテン語の小さな文字A
     Ⓒ24B8CIRCLEDLATINCAPITAL LETTER C
     ⓒ24D2CIRCLEDLATINSMALL LETTER C
     DZ01F1ラテン大文字DZ
     Dz01F2ラテン大文字Dと小文字Z
     dz01F3LATINSMALLLETTER DZ
     ⅲ2172小さなローマ数字の3つ
     S0053ラテン大文字S
     s0073ラテン文字S
     ſ017F LATIN SMALL LETTER LONG S
     ⒮24AEPARENTHESIZEDLATINSMALL LETTER S
     Ⓢ24C8CIRCLEDLATINCAPITAL LETTER S
     ⓢ24E2CIRCLEDLATINSMALL LETTER S
     ꞄA784ラテン大文字インシュラーS
     ꞅA785LATINSMALLLETTER INSULAR S
     ß00DFラテンスモールレターシャープS
     ẞ1E9Eラテン大文字シャープS
     Ⅶ2166ローマ数字セブン
     ⅻ217Bスモールローマ数字12

次の結果が得られます。

     @0040コマーシャル
     ©00a9著作権記号
     å212bオングストローム記号
     ⒜249c括弧で囲まれたラテン小文字a
     ⓐ24b6丸で囲まれたラテン大文字a
     Ⓐ24d0丸で囲まれたラテン小文字a
     aff21全幅ラテン大文字a
     AAff41全幅ラテン小文字a
     ⓒ24b8丸で囲まれたラテン大文字c
     Ⓒ24d2丸で囲まれたラテン小文字c
     dz01f1ラテン大文字dz
     dz01f2ラテン大文字dと小文字z
     DZ01f3ラテン小文字dz
     Ⅲ2172小さなローマ数字3
     s0053ラテン大文字s
     S0073ラテン小文字s
     S017fラテン小文字ロングs
     ⒮24ae括弧で囲まれたラテン小文字s
     ⓢ24c8丸で囲まれたラテン大文字s
     Ⓢ24e2丸で囲まれたラテン小文字s
     ꞅa784ラテン大文字insulars
     Ꞅa785ラテン文字インシュラー体のS
     SS00dfラテン小文字シャープs
     ß1e9eラテン大文字シャープs
     ⅶ2166ローマ数字7
     Ⅻ217b小さなローマ数字12

最初の関数を使用して(そのセットで)異なる唯一の部分は、dzシーケンスが代わりに次のようになることです。

     dz01f1ラテン大文字dz
     DZ01f2ラテン大文字dと小文字z
     DZ01f3ラテン小文字dz

上位または下位のテストだけを使用したくない理由は、大文字と小文字を区別しても大文字と小文字が変わらない大文字と小文字が区別されるコードポイントがたくさんあるため、不要な作業を行うためです。たとえば、これらはすべて大文字と小文字を区別するコードポイントですが、大文字でも小文字でも変更されません。

     ª00AA女性の序数標識
     ᴬ1D2CMODIFIERLETTER CAPITAL A
     ᴀ1D00ラテン文字スモールキャピタルA
     ℂ2102DOUBLE-STRUCKCAPITALC
     ᴰ1D30MODIFIERLETTERCAPITAL D
     ʣ02A3LATINSMALL LETTER DZ DIGRAPH
     ʤ02A4LATINSMALL LETTER DEZH DIGRAPH
     ℇ2107オイラー定数
     ɘ0258LATINSMALLLETTER REVERSED E
     ɞ025ELATINSMALLLETTER CLOSED REVERSED OPEN E
     ℊ210AスクリプトスモールG
     ɡ0261LATINSMALLLETTER SCRIPT G
     ɢ0262ラテン文字スモールキャピタルG
     ʰ02B0MODIFIERLETTER SMALL H
     ℋ210BスクリプトキャピタルH
     ℎ210Eプランク定数
     ℹ2139情報源
     ʲ02B2MODIFIERLETTER SMALL J
     ℳ2133スクリプトキャピタルM
     º00BA男性的な序数標識
     ɸ0278LATINSMALLLETTER PHI
     ĸ0138LATINSMALLLETTER KRA
     ʏ028Fラテン文字小大文字Y
     ℼ213CDOUBLE-STRUCKSMALL PI

したがって、それらが大文字または小文字であることを検出し、逆マッピング関数を呼び出して、何も変更されていないことを検出します。私は理解します、なぜわざわざ?

于 2011-04-09T22:32:54.773 に答える