也许你可能会重新考虑你的方法。
您想将正则表达式替换传递给函数,可能是因为该函数将从其他来源(从文件、套接字等读取)派生要操作的文本。但是您将正则表达式与正则表达式替换混为一谈。
在表达式s/foo/bar/ 中,您实际上有一个正则表达式 ("/foo/") 和一个替换 ("bar") 应该替换表达式匹配的内容。在您迄今为止尝试的方法中,您在尝试使用 eval 时遇到了问题,主要是因为表达式中的特殊字符可能会干扰 eval 或在评估过程。
因此,请尝试向您的例程传递两个参数:表达式和替换:
sub apply_regex {
my $regex = shift;
my $subst = shift || ''; # No subst string will mean matches are "deleted"
# Some setup and processing happens...
# Time to make use of the regex that was passed in:
while (defined($_ = <$some_filehandle>)) {
s/$regex/$subst/g; # You can decide if you want to use /g etc.
}
# The rest of the processing...
}
这种方法有一个额外的好处:如果你的正则表达式模式没有有任何特殊字符,你可以直接传入它:
apply_regex('foo', 'bar');
或者,如果是这样,您可以使用qr// quoting-operator 创建一个正则表达式对象并将其作为第一个参数传递:
apply_regex(qr{(foo|bar)}, 'baz');
apply_regex(qr/[ab]+/, '(one or more of "a" or "b")');
apply_regex(qr|\d+|); # Delete any sequences of digits
最重要的是,您真的不需要eval 或使用代码引用/闭包来完成此任务。这只会增加复杂性,可能会使调试变得比需要的更难。