tr///
を使用すると、変数ではなくリテラル文字のみを使用できることに注意してください。したがって、tr/a-z/$i-Z/
機能しません。を使用する必要がありますtr/a-z/A-Z/
。perldoc perlopでは、補間またはその欠如についての詳細を読みtr///
、説明を見つけることができます。
文字列を大文字に変換する方法は他にもありますが。uc
関数、または正規表現エスケープシーケンス\U
(大文字)と(小文字)を使用できます\L
。例えば:
my $str = 'a';
my $uppercase = uc $str;
正規表現:
my $str = 'abcdef';
$str =~ s/([a-z]+)/\U$1/; # $str is now 'ABCDEF'
tchristは、大文字と小文字の影響を受けるすべての文字を含む[a-z]
ように書く必要があると指摘しています。\p{CWU}
アップデート:
ある種の動的エンコーディング機能を作成しようとしている場合は、引数を取り、文字を手動で移動するサブルーチンをお勧めします。
sub foo {
my ($str, $num) = @_; # num is how many characters to shift the alphabet
my @in = 'A' .. 'Z';
my @out = @in[$num .. $#in, 0 .. $num-1];
my %out = map { $in[$_] => $out[$_] } 0 .. $#in;
$str =~ s#(.)# $out{$1} // $1 #eg; # if key does not exist, use org
return $str;
}
大文字と小文字が区別されることに注意してください。ただし、これを解決するために小文字のキーを追加できます。