trans
是一个非常有用和强大的工具,但对我来说仍然是
a bit of a mystery.
例如.我仍然不理解文档中的这句话:
In case a list of keys and values is used,substrings can be replaced
as well.
如果键和值长于一个符号,算法是什么?
以下测试代码探讨了.trans如何使用“冲突”键.为什么第一对的工作方式会有所不同,具体取决于它是单独的还是伴随第二对?
my Pair @trans = ab => '12',bc => '34',; my $str = 'ab'; say "both trans: $str.trans(@trans)"; # 13 say "1st trans: $str.trans(@trans[0])"; # 12
使用哈希而不是对列表会产生不同的结果:
my %trans = ab => '12',; my $str = 'ab'; say "both trans: $str.trans(%trans)"; # 12
(我知道在散列中,对可以按任何顺序进行,但在第一个带有列表的例子中,它是第一对,如果第二对存在则不完全使用)
解决方法
.trans需要一个或多个对参数,它们一起描述所需的翻译.
单个对的翻译,其键是单个字符串
P6将对的键字符串的第N个字符映射到该对的值字符串的第N个字符.
因此.trans:“ab”=> “12”将“a”映射到“1”并将“b”映射到“2”.
单个对的翻译,其键是字符串列表
P6将该对键列表的第N个字符串映射到该对值列表的第N个字符串.
因此.trans:(“ab”,“bc”)=> (“12”,“13”)将“ab”映射到“12”并将“bc”映射到“13”.
翻译对的列表
根据密钥是否包含一个字符串或它们的列表,单个对的翻译以上述两种形式中的一种或另一种进行.
对列表的转换只是重复每对的过程,根据该对的键执行第N个字符或第N个字符串映射.
how
.trans
works with ‘conflicting’ keys
给定一对对列表,P6首先尝试第一个,如果不匹配,则第二对,依此类推.
我需要探索lizmat现在的想法,以及当她在her earlier answer about .trans
中说出以下内容时她的意思:
I think you misunderstand what
.trans
does. You specify a range of characters to be changed into other characters. You are NOT specifying a string to be changed to another string.
我认为你从文档中引用的句子有点含糊不清:
In case a list of keys and values is used,substrings can be replaced as well.
这意味着传递给.trans的对的(单个).key属性存储字符串列表而不是单个字符串,同样对于该对的单个.value属性.