首先,您的哈希初始化已关闭:哈希被初始化为列表:
my %dict = ( hello => 'hola', goodbye => 'adios' , ... );
或者您可以使用哈希引用:
my $dict = { hello => 'hola', goodbye => 'adios' , ... };
这是一个标量。
用字符串中的值替换键很容易:
s/$_/$dict{$_}/g for keys %dict;
除非
- 替换的内容不应被替换,例如
%dict = (a => b, b => c)
应该转换"ab"
为"bc"
(不是"cc"
上述解决方案可能会或可能不会做的,哈希顺序是随机的)。
- 键可以包含正则表达式元字符,如
.
、+
或()
。这可以通过使用该quotemeta
函数转义正则表达式元字符来规避。
传统的方法是构建一个匹配所有键的正则表达式:
my $keys_regex = join '|', map quotemeta, keys %dict;
然后:
$string =~ s/($keys_regex)/$dict{$1}/g;
它解决了所有这些问题。
在正则表达式构建代码中,我们首先用 转义所有键map quotemeta
,然后用 连接字符串|
以构建匹配所有键的正则表达式。生成的正则表达式非常有效。
这保证了字符串的每个部分只翻译一次。