首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在替换中使用变量作为修饰符

问如何在替换中使用变量作为修饰符
EN

Stack Overflow用户
提问于 2010-07-13 22:48:44
回答 5查看 1.8K关注 0票数 5

有没有办法在替换中使用变量作为修饰符?

代码语言:javascript
复制
my $search = 'looking';
my $replace = '"find: $1 ="';
my $modifier = 'ee';

s/$search/$replace/$modifier;

我需要使用散列数组来进行批量搜索-替换为不同的修饰符。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-13 23:42:53

嗯,如果我必须这么做,我会这样做:

代码语言:javascript
复制
use warnings;
use strict;
my @stuff = (
{
    search => "this",
    replace => "that",
    modifier => "g",
},
{
    search => "ono",
    replace => "wendy",
    modifier => "i",
}
);
$_ = "this ono boo this\n";
for my $h (@stuff) {
    if ($h->{modifier} eq 'g') {
        s/$h->{search}/$h->{replace}/g;
    } elsif ($h->{modifier} eq 'i') {
        s/$h->{search}/$h->{replace}/i;
    }
    # etc.
}
print;

你可能只想使用这么多不同的修饰符,所以我认为这已经足够简单了。

你可以使用eval来做这件事,但是它太混乱了。

票数 3
EN

Stack Overflow用户

发布于 2010-07-13 22:56:37

你可以使用eval,如果你戴上你的安全护目镜和你的除零套装。

例如:

代码语言:javascript
复制
use strict;
use warnings;
sub mk_re {
  my ($search, $replace, $modifier) = @_;
  $modifier ||= '';
  die "Bad modifier $modifier" unless $modifier =~ /^[msixge]*$/;
  my $sub = eval "sub { s/($search)/$replace/$modifier; }";
  die "Error making regex for [$search][$replace][$modifier]: $@" unless $sub;
  return $sub;
}

my $search = 'looking';
my $replace = '"find: $1 ="';
my $modifier = 'e';

# Sub can be stored in an array or hash
my $sub = mk_re($search, $replace, $modifier);

$_ = "abc-looking-def";
print "$_\n";
$sub->();
print "$_\n";
票数 4
EN

Stack Overflow用户

发布于 2010-07-14 02:52:29

虽然使用eval编译新替换的方法可能是最简单的,但您可以创建更模块化的替换:

代码语言:javascript
复制
use warnings;
use strict;

sub subst {
    my ($search, $replace, $mod) = @_;

    if (my $eval = $mod =~ s/e//g) {
        $replace = qq{'$replace'};
        $replace = "eval($replace)" for 1 .. $eval;
    } else {
        $replace = qq{"$replace"};
    }
    sub {s/(?$mod)$search/$replace/ee}
}

my $sub = subst '(abc)', 'uc $1', 'ise';

local $_ = "my Abc string";

$sub->();

print "$_\n";  # prints "my ABC string"

这只是一个简单的测试,它留给读者作为练习来实现其他标志,比如g

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3238348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档