我正在尝试将s/ / /g
正则表达式存储为变量(没有太多运气)。
这是一个使用普通匹配来展示我打算做什么的例子。
my %file_structure = (
header => qr/just another/,
table => qr/perl beginner/,
)
现在我可以使用$line =~ $file_structure{'header'}
来调用它,如果模式匹配,它将返回undef
或true
。
但我想说$line =~ $file_structure{'foo'}
其中$file_structure{'foo'}
包含s/beginner/hacker/g
之类的内容。
答案 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 ...;