【问题标题】:Substitution method using the "$1" string?使用“$1”字符串的替换方法?
【发布时间】:2016-02-26 11:40:07
【问题描述】:
my $st = 'abcd';
my $grep1 = 'a(bc)d';
my $grep2 = '$1';
$st =~ s/$grep1/$grep2/;
print $st,"\n";

如果你运行代码,输出是'$1',但我想看到'bc'。

$grep2不能直接放入正则表达式,因为输入值。

我该怎么做?

【问题讨论】:

标签: regex perl


【解决方案1】:

以下将做你想做的事:

use String::Substitution qw( sub_modify );

my $st = 'abcd';
my $grep1 = 'a(bc)d';
my $grep2 = '$1';
sub_modify($st, $grep1, $grep2);
print $st,"\n";

这种解决方案的优点是它不允许像eval EXPR(又名/ee)那样执行任意代码。

【讨论】:

    【解决方案2】:

    在这种特定情况下,一个解决方案是使用 /e 修饰符两次

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    my $st = 'abcd';
    my $grep1 = 'a(bc)d';
    my $grep2 = '$1';
    
    $st =~ s/$grep1/$grep2/ee;
    
    print $st,"\n";
    

    输出:

    bc
    

    为了让它不那么脆弱,我建议您用两组引号将您的 RHS 括起来:

    $st =~ s/$grep1/qq{qq{$grep2}}/ee;
    

    注意:正如 ikegami 所提到的,评估未经处理的输入是非常危险的。因此,我不建议在一般情况下这样做。此外,可能还有更好的解决方案可供您使用,但您首先必须解开您的XY 问题性质。

    【讨论】:

    • 谢谢body~这是一个简单而伟大的答案!
    • 这是一个糟糕的答案。这个解决方案非常危险,你甚至没有提到它!
    • my $grep2 = '[$1]'; 也失败了,我确信 OP 期望生成 [bc]
    • @ikegami 是的,这很危险,添加了警告。是的,我知道解决方案很脆弱,并且会因输入不同而失败,这就是为什么我已经提供了第二个不那么脆弱的选项。无论如何,我很乐意为您的 cpan 模块建议投票。
    • 你在说什么?你的第二个解决方案也好不到哪里去。它可能会处理my $grep2 = '[$1]';,但它会处理my $grep2 = '}$1{'; 失败。更重要的是,它同样危险,允许执行任意代码。
    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 2011-01-24
    • 2014-03-03
    • 2013-07-27
    • 2023-04-01
    相关资源
    最近更新 更多