regex - Perl 正则表达式从哈希替代

标签 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);

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

最佳答案

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

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

my $check = join '|', keys %regex;

然后你可以进行替换:
s/($check)/$regex{$1}/g;

这仍然可能是“缓慢”的,因为键有足够的重叠,正则表达式引擎必须不断地重新检查相同的字母。你可以使用类似 Regexp::Optimizer 的东西以消除重叠。但是优化的成本可能不仅仅是做所有事情的成本,这取决于有多少更改(散列中的键/值)以及您修改了多少行。过早优化——!

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

关于regex - Perl 正则表达式从哈希替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6430964/

相关文章:

mysql - 在一个 perl 脚本中执行两个查询

perl - 使用系统命令将 stdout 和 stderr 输出重定向到文件在 perl 中不起作用

java - 需要帮助来解析目录的正则表达式

c - 如何在 C 中使用 POSIX regexec 和 libpcap 匹配 UDP 负载中的 URL

python - 将字符串分成 block ,然后将这些 block 传递给一个新对象。 python 3

perl - 使用 MediaWiki::API 创建和更新 wiki 页面

perl - 如何编译我的 Perl 脚本以减少启动时间?

xml - 如何将 Lua 函数添​​加到 Notepad++ functionList.XML

javascript - 如何使用正则表达式检查给定值中至少 3 个字符

perl - 使用 IO::Event 检测目录中的新文件