【发布时间】:2020-04-16 01:24:00
【问题描述】:
在 perl 中,我正在读取一行并尝试使用一系列 if 语句将一组字符串替换为相应的表达式。例如:
my @shiftInstructions=("lsr", "lsl", "rol", "ror");
while (my $line = <>) {
if ($line =~ /\$sh/) {
my $r = int(rand(6));
$line =~ s/\$sh/$r/;
}
if ($line =~ /\$ish/) {
my $r = $shiftInstructions[rand(4)]
$line =~ s/\$ish/$r/;
}
}
出于多种原因,我不喜欢这种方法。首先,它是重复的。我必须首先检查模式是否存在,如果存在,则执行一个函数来生成替换值,然后替换。所以它既冗长又缓慢(每个模式需要 2 次正则表达式搜索,最终可能需要几十个模式字符串)。
我想到了一个映射,其中一些代码映射到相应的代码来执行。
我可以想象映射到一个字符串,然后使用 eval,但是除了运行时我无法检查代码。有没有更清洁的方法?
我在正则表达式中找到了执行选项。如何编写一组子程序来处理每个正则表达式,然后创建一个映射:
my %regexMap = (
"\$fn", &foundFunc,
"\$hw", &hex8,
"\$hb", &hex2,
"\$sh", &rand6,
"\$ish", &shiftInst,
);
while (my $line = <>) {
$line =~ s/(\$fn|\$hw|\$hb|\$sh|\$ish|)/$regexMap{$1}/e;
print $line;
}
【问题讨论】: