在 Cool 中§
有关方法 trans,请参阅上下文中的主要文档
method trans(|)
在 Str 中§
有关方法 trans,请参阅上下文中的主要文档
multi method trans(Str: Pair \what, * --> Str)multi method trans(Str: *, :complement(:), :squash(:), :delete(:) --> Str)
用一个或多个字符替换一个或多个字符。支持范围,适用于键和值。正则表达式用作键。如果使用键和值列表,则还可以替换子字符串。使用 :complement
调用时,除了匹配的值或范围之外的任何内容都将替换为单个值;使用 :delete
时,将删除没有相应替换的匹配字符。组合 :complement
和 :delete
将删除除匹配值之外的所有内容,除非指定了替换字符,在这种情况下,将忽略 :delete
。副词 :squash
将重复匹配的字符减少为单个字符。
示例
my = 'say $x<b> && $y<a>';.=trans( '<' => '«' );.=trans( '<' => '«', '>' => '»' );.=trans( [ '<' , '>' , '&' ] =>[ '<', '>', '&' ]);.=trans( ['a'..'y'] => ['A'..'z'] );"abcdefghij".trans(/ \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
),从而导致显示为输出的行为。