所以我的问题是我试图将所有出现的某个角色替换为另一个角色。
它的用法如下:“用法:./ swap.pl'输入''输出'”;
其中input是要更改所有匹配项的字符串,输出是要更改的字符。
我的脚本也需要能够识别正则表达式。
这种情况下出现问题([aeiou] [aeiou])到'$ 2 $ 1'意思是翻转捕获组中的字符。
我试过了:
1.拉出字符串,拆分它并改变它们的位置,但它会保存第一次出现并将其用于其余的匹配,而不是每次更新。
使用替换(s ///)但它不会将$ 1 $ 2解释为其值。显然我可以使用一个eval(qq {})表达式,但它似乎不适用于替换运算符。
使用tr //;但那并没有真正做任何事情。
我尝试评估字符串,然后通过在交换顺序中保存字符来创建一个新字符串,但这似乎也不起作用。
我有点卡住,不知道如何继续。有什么想法吗?
这是我的代码:
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语句中使用它们,它们只捕获第一组并保持相同
如果在替换中使用,则每次遇到匹配时捕获组都会更新。我只是检查输入是否是正则表达式。
答案 0 :(得分:4)
在正则表达式Mirii
中,您只有一个捕获组,因此([aeiou][aeiou])
不会包含任何内容,您可能需要$2
。
至于将替换解释为代码,您可以使用/ee
modifier,这意味着“将右侧评估为字符串,然后eval结果。”需要注意的一点是([aeiou])([aeiou])
允许执行任意代码,因此只要这只是一个实验练习就可以了,但是在多用户环境中需要非常小心。
(我会对用户提供的正则表达式应用类似的警告,即使用户提供的代码的执行通常是restricted。)
因为替换中的字符串将被评估为Perl表达式,我们需要在两个字符串之间添加点串联运算符,因为eval
无效。
$2$1