perl在使用tr//运算符时给出不同的结果
为什么perl在下面给出不同的结果perl在使用tr//运算符时给出不同的结果,perl,Perl,为什么perl在下面给出不同的结果 $a = "bar"; $a =~ tr/abc/ABC/d; print "[$a]\n"; # prints "BAr" as expected. $x = "bar"; $y = "abc"; $z = "ABC"; $x =~ tr/\\Q$y\\E/\\Q$z\\E/d; print "[$x]\n"; # prints "bar" to my surprise. 类似地,还有一个测试用例,如下所示: $p = "--aaa--"; $q = "
$a = "bar";
$a =~ tr/abc/ABC/d;
print "[$a]\n"; # prints "BAr" as expected.
$x = "bar";
$y = "abc";
$z = "ABC";
$x =~ tr/\\Q$y\\E/\\Q$z\\E/d;
print "[$x]\n"; # prints "bar" to my surprise.
类似地,还有一个测试用例,如下所示:
$p = "--aaa--";
$q = "abc-";
$r = "ABC";
$p =~ tr/\\Q$q\\E/\\Q$r\\E/d;
print "[$p]\n"; # prints "--aaa--" surprisingly.
$s = "--aaa--";
$s =~ tr/abc-/ABC/d;
print "[$s]\n"; # prints "AAA" as expected.
有人能解释一下这种行为吗
致以最良好的祝愿,
穆罕默德·安瓦尔不插值
tr/\\Q$y\\E/\\Q$z\\E/d
至\
\
toQ
Q
至$
$
至y
z
至E
E
$x
不包含任何这些字符,因此它保持不变
tr/\\Q$Q\\E/\\Q$r\\E/d
至\
\
toQ
Q
至$
$
toq
r
至E
E
$p
不包含任何这些字符,因此它保持不变
要获得所需的行为,您可以使用
my %tr;
@tr{ split(//, $fr) } = split(//, $to);
$_ //= '' for values %tr;
my $re = '['.( join '', map quotemeta, keys %tr ).']';
$s =~ s/($re)/$tr{$1}/g;
或
tr//
不插值
tr/\\Q$y\\E/\\Q$z\\E/d
至\
\
toQ
Q
至$
$
至y
z
至E
E
$x
不包含任何这些字符,因此它保持不变
tr/\\Q$Q\\E/\\Q$r\\E/d
至\
\
toQ
Q
至$
$
toq
r
至E
E
$p
不包含任何这些字符,因此它保持不变
要获得所需的行为,您可以使用
my %tr;
@tr{ split(//, $fr) } = split(//, $to);
$_ //= '' for values %tr;
my $re = '['.( join '', map quotemeta, keys %tr ).']';
$s =~ s/($re)/$tr{$1}/g;
或