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

Chr*_*s R 10 regex perl

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

这是一个使用常规匹配来显示我打算做什么的示例.

my %file_structure = (
    header => qr/just another/,
    table  => qr/perl beginner/,
)
Run Code Online (Sandbox Code Playgroud)

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

不过我想说$line =~ $file_structure{'foo'}哪里$file_structure{'foo'}有类似的东西s/beginner/hacker/g.

tad*_*dmc 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";
Run Code Online (Sandbox Code Playgroud)

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

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

my $line = 'just another perl beginner';
eval "\$line =~ $file_structure{foo}";
print "$line\n";
Run Code Online (Sandbox Code Playgroud)


Eri*_*rom 9

正如您所发现的,没有办法直接存储替换正则表达式,就像匹配正则表达式(with 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 ...;
Run Code Online (Sandbox Code Playgroud)

  • 你也可以`map $ file_structure {foo_whatever},...`我相信这三个版本中的任何一个都适合表达式传递. (2认同)