请注意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;
}
请注意,它区分大小写,但您可以添加小写键来解决此问题。