需要使用替换

时间:2018-03-08 05:37:44

标签: perl substitution

所以我的问题是我试图将所有出现的某个角色替换为另一个角色。

它的用法如下:“用法:./ swap.pl'输入''输出'”;

其中input是要更改所有匹配项的字符串,输出是要更改的字符。

我的脚本也需要能够识别正则表达式。

这种情况下出现问题([aeiou] [aeiou])到'$ 2 $ 1'意思是翻转捕获组中的字符。

我试过了:

1.拉出字符串,拆分它并改变它们的位置,但它会保存第一次出现并将其用于其余的匹配,而不是每次更新。

  1. 使用替换(s ///)但它不会将$ 1 $ 2解释为其值。显然我可以使用一个eval(qq {})表达式,但它似乎不适用于替换运算符。

  2. 使用tr //;但那并没有真正做任何事情。

  3. 我尝试评估字符串,然后通过在交换顺序中保存字符来创建一个新字符串,但这似乎也不起作用。

  4. 我有点卡住,不知道如何继续。有什么想法吗?

    这是我的代码:

    my $size = $#ARGV + 1;
    if ($size != 2)
    {
            print STDERR "Usage: ./swap.pl 'input' 'output'";
            exit 1;
    }
    
    while(<STDIN>)
    {
    
            $_ =~ s/$ARGV[0]/$ARGV[1]/ig;
            print $_;
    
    }
    

    大多数案例都很有效:

    “Isaac Newton和Apple |”./ swap.pl'p''q'“将输出”Isaac Newton和Aqqle“

    但像([l])([e])这样的案件被视为;

    “Isaac Newton和Apple |”./ swap.pl'([l])([e])''$ 2 $ 1'“将输出”Isaac Newton和App $ 2 $ 1“而它应该输出”Isaac牛顿和Appel“

    EDIT2: 我尝试回到#2并且该命令似乎正在工作,但它只捕获第一个捕获组并存储它,而我需要它来捕获每个新发生的组。

    EDIT3:

    经过一段时间的努力,我想通了!捕获组意味着不同的东西取决于您使用它们的位置。如果我在if语句中使用它们,它们只捕获第一组并保持相同

    如果在替换中使用,则每次遇到匹配时捕获组都会更新。我只是检查输入是否是正则表达式。

1 个答案:

答案 0 :(得分:4)

在正则表达式Mirii 中,您只有一个捕获组,因此([aeiou][aeiou])不会包含任何内容,您可能需要$2

至于将替换解释为代码,您可以使用/ee modifier,这意味着“将右侧评估为字符串,然后eval结果。”需要注意的一点是([aeiou])([aeiou])允许执行任意代码,因此只要这只是一个实验练习就可以了,但是在多用户环境中需要非常小心。 (我会对用户提供的正则表达式应用类似的警告,即使用户提供的代码的执行通常是restricted。)

因为替换中的字符串将被评估为Perl表达式,我们需要在两个字符串之间添加点串联运算符,因为eval无效。

$2$1