Perl正则表达式替代哈希

psa*_*nts 11 regex perl

有没有一种有效的方法来使用Perl哈希中的值替换字符串?

例如,

$regex{foo} = "bar";
$regex{hello} = "world";
$regex{python} = "perl";

open(F, "myfile.txt");
while (<F>) {
      foreach $key (keys %regex) {
            s/$key/$regex{$key}/g;
      }
}
close(F);
Run Code Online (Sandbox Code Playgroud)

有没有办法在Perl中完成上述操作?

Tan*_*lus 5

第一个问题:你确定你所拥有的是低效率的吗?

其次,最明显的下一步是将所有内容整合到一个正则表达式中:

my $check = join '|', keys %regex;
Run Code Online (Sandbox Code Playgroud)

然后你可以做替换为:

s/($check)/$regex{$1}/g;
Run Code Online (Sandbox Code Playgroud)

由于正则表达式引擎必须不断地重新检查相同的字母,因此密钥的充分重叠仍然会"慢".您可以使用Regexp :: Optimizer之类的东西来消除重叠.但是优化的成本可能不仅仅是执行所有操作的成本,具体取决于更改的数量(哈希中的键/值)以及您要修改的行数.过早的优化 - !

请注意,当然,您的示例代码在替换后没有对文本执行任何操作.它不会就地修改文件,所以我假设您正在单独处理它.