在 Cool 中§

有关方法 trans,请参阅上下文中的主要文档

method trans(|)

将调用者强制转换为 Str 并调用 Str.trans

在 Str 中§

有关方法 trans,请参阅上下文中的主要文档

multi method trans(Str:D: Pair:D \what*%n --> Str)
multi method trans(Str:D: *@changes:complement(:$c), :squash(:$s), :delete(:$d--> Str)

用一个或多个字符替换一个或多个字符。支持范围,适用于键和值。正则表达式用作键。如果使用键和值列表,则还可以替换子字符串。使用 :complement 调用时,除了匹配的值或范围之外的任何内容都将替换为单个值;使用 :delete 时,将删除没有相应替换的匹配字符。组合 :complement:delete 将删除除匹配值之外的所有内容,除非指定了替换字符,在这种情况下,将忽略 :delete。副词 :squash 将重复匹配的字符减少为单个字符。

示例

my $str = 'say $x<b> && $y<a>';
$str.=trans'<' => '«' );
$str.=trans'<' => '«''>' => '»' );
 
$str.=trans( [ '<'   , '>'   , '&' ] =>
             [ '&lt;''&gt;''&amp;' ]);
 
$str.=trans( ['a'..'y'=> ['A'..'z'] );
 
"abcdefghij".trans(/<[aeiou]> \w/ => '');                     # OUTPUT: «cdgh» 
 
"a123b123c".trans(['a'..'z'=> 'x':complement);            # OUTPUT: «axxxbxxxc» 
"aaa1123bb123c".trans('a'..'z' => 'A'..'Z':squash);         # OUTPUT: «A1123B123C» 
"aaa1123bb123c".trans('a'..'z' => 'x':complement:squash); # OUTPUT: «aaaxbbxc»

通常,字符串在替换后长度相同

say "a123b123c".trans('23' => '4');   # OUTPUT: «a144b144c␤» 
say "a123b123c".trans('123' => 'þð'); # OUTPUT: «aþðþbþðþc␤»

在这种情况下,:squash:delete 将产生相同的效果,使其成为严格替换

say "a123b123c".trans('123' => 'þð':squash); # OUTPUT: «aþðbþðc␤» 
say "a123b123c".trans('123' => 'þð':delete); # OUTPUT: «aþðbþðc␤»

:delete 还将从原始字符串中删除不匹配的字符

say "abc".trans("abc".comb => 1..2:delete);  # OUTPUT: «12␤»

请注意,两个多方法版本的行为略有不同。如果原点也是一个字符,则第一种形式将只转置一个字符

say "abcd".trans"a" => "zz" );  # OUTPUT: «zbcd␤» 
say "abcd".trans"ba" => "yz" ); # OUTPUT: «zycd␤» 

在第二种情况下,行为符合预期,因为原点长度超过一个字符。但是,如果多方法中的 Pair 没有 Str 作为原点或目标,则将其处理为第二个多方法,并且行为发生变化

say "abcd".trans: ["a"=> ["zz"]; # OUTPUT: «zzbcd␤»

在这种情况下,Pair 中的原点和目标都不是 Str;然后,具有 Pair 签名的该方法调用第二个方法,从而使上述调用等效于 "abcd".trans: ["a"] => ["zz"],(后面带有逗号,使其成为 Positional,而不是 Pair),从而导致显示为输出的行为。