Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl在使用tr//运算符时给出不同的结果_Perl - Fatal编程技术网

perl在使用tr//运算符时给出不同的结果

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 = "

为什么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 = "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

  • \
    \
  • Q
    to
    Q
  • $
    $
  • y
    z
  • E
    E
$x
不包含任何这些字符,因此它保持不变


tr/\\Q$Q\\E/\\Q$r\\E/d

  • \
    \
  • Q
    to
    Q
  • $
    $
  • q
    to
    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

  • \
    \
  • Q
    to
    Q
  • $
    $
  • y
    z
  • E
    E
$x
不包含任何这些字符,因此它保持不变


tr/\\Q$Q\\E/\\Q$r\\E/d

  • \
    \
  • Q
    to
    Q
  • $
    $
  • q
    to
    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;