修飾子は、/c
ここでは理解できないことを行います。次のコードが「abc3333」を出力する理由を知りたいのですが?
#!/usr/bin/perl
$x = 'abcdefg';
$x =~ tr/abc/123/c;
print $x;
/c
検索リストが補完されます。つまり、リストされていないすべての文字が検索されます。
範囲内の文字のみがあると仮定すると\0-\xff
、これは次のようになります。
tr/abc/123/c
これと同等です:
tr/\0-\x60\x64-\xff/123/
置換リストの最後の文字は、検索リストの文字数と一致するように必要な回数繰り返されます(/ dを使用しない場合)。
したがって、「\ 0」は「1」になり、「\ 1」は「2」になり、「a」、「b」、または「c」は変更されず、その他の文字は「3」になります。
/cで置換リストを指定することはかなり珍しいことです。通常、/cはカウントのためだけに使用されます。
tr/abc//c # returns number of non-abc characters; string is unchanged
または削除:
tr/0-9//cd # delete all non-digits
/c
通常、変更に使用されます/d
tr/...//d; # Delete every matching char.
tr/...//cd; # Delete every char that doesn't match.
またはカウント用。
tr/...//; # Returns number of matching chars.
tr/...//c; # Returns number of chars that don't match.
空でない置換セットを使用した場合の有用な例を思い付くことができませんが、説明は簡単です。検索セットの補数を使用するだけです。a
、b
およびは文字0x61、0x62 c
、および0x63であることに注意してください。
tr/abc/123/c;
したがって、
tr/\x00-\x60\x64-\x{FFFFFFFFF}/123/; # Perl with 32bit ints
or
tr/\x00-\x60\x64-\x{FFFFFFFFFFFFFFFFFF}/123/; # Perl with 64bit ints
置換セットの最後の文字は、検索セットに対応する文字がない文字に使用されることに注意してください。
"\x00"
になります1
"\x01"
になります2
3
ます。tr
この動作は、ベースとなるコマンドラインツールと完全に一致していtr///
ます。なしでどのよう/c
に役立つかはわかりませんが、コマンドラインツールが持つ/d
追加機能(文字クラスなど)のためかもしれません。tr
tr///
/c
修飾子は、リスト内の文字の補数に影響します。/d
これは主に、特定の文字セットを除くすべてを削除するために、修飾子と一緒に使用されます。
my $string = 'ABCdef123';
$string =~ tr/a-z//cd;
print $string;
出力
def