如何在变量中保存替换正则表达式(搜索/替换),类似于qr //

时间:2011-02-05 03:41:25

标签: regex perl

我正在尝试将s/ / /g正则表达式存储为变量(没有太多运气)。

这是一个使用普通匹配来展示我打算做什么的例子。

my %file_structure = (
    header => qr/just another/,
    table  => qr/perl beginner/,
)

现在我可以使用$line =~ $file_structure{'header'}来调用它,如果模式匹配,它将返回undeftrue

但我想说$line =~ $file_structure{'foo'}其中$file_structure{'foo'}包含s/beginner/hacker/g之类的内容。

2 个答案:

答案 0 :(得分:10)

您应该分开存储2个部分:

my %file_structure = (
    foo => {pat => qr/beginner/, repl => 'hacker'},
);

my $line = 'just another perl beginner';
$line =~ s/$file_structure{foo}{pat}/$file_structure{foo}{repl}/;
print "$line\n";

哪个比使用邪恶的“eval EXPR”更安全:

my %file_structure = (
    foo => 's/beginner/hacker/',
);

my $line = 'just another perl beginner';
eval "\$line =~ $file_structure{foo}";
print "$line\n";

答案 1 :(得分:9)

正如您所发现的那样,无法直接存储替换正则表达式,就像匹配正则表达式(使用qr//)一样。您可以打破部件并重新组合它们,如tadmc所示。另一种方法是将替换存储在子例程中:

my %file_structure = (
   foo_uses_default => sub {s/foo/bar/},
   foo_takes_arg    => sub {$_[0] =~ s/foo/bar/},
   foo_does_either  => sub {(@_ ? $_[0] : $_) =~ s/foo/bar/},
);

$file_structure{foo_uses_default}() for ...;
$file_structure{foo_uses_arg}($_)   for ...;