Perl:快速替换数组中多个单词的出现次数

时间:2013-04-04 12:44:59

标签: regex arrays perl

很抱歉,如果这是一个重复的主题,但我在论坛内搜索过,我只发现了类似但不完全相同的问题。

我的问题是:

我有一个像这样的字符串数组:

@array = ("My name is "Annie" \n", "My mother's name was "Annie", too. \n", "I am "27" years old \n", "I live in "Minnesota" \n");

另一个像这样的字符串数组:

@subs = ("Annie", "22", "Minnesota");

我想:

1)在第一个数组中找到第二个数组中出现的任何单词(例如:Annie将与第一个和第二个元素匹配,明尼苏达只与最后一个元素匹配)。

2)将所有与第二个数组的任何元素匹配的单词替换为相同的单词后跟“-DATA”(例如:“我的名字是”Annie-DATA“\ n”)。

我想这可以通过一个或两个for循环轻松完成,但我想知道是否有更快捷的方法,也许可以巧妙地使用PERL的正则表达式。

谢谢!

3 个答案:

答案 0 :(得分:2)

你可以这样替换:

s/(Annie|22|Minnesota)/\1-DATA/g

答案 1 :(得分:2)

一个解决方案:

use strict;
use warnings;
my @array = ("My name is \"Annie\" \n",
   "My mother's name was \"Annie\", too. \n",
   "I am \"27\" years old \n",
   "I live in \"Minnesota\" \n");
my @subs = ("Annie", "22", "Minnesota");

my @new_array = map { my $line = $_; 
                      $line =~ s/$_/$_-DATA/g foreach @subs; 
                      $line } @array;

答案 2 :(得分:1)

另一种解决方案也逃脱了元字符:

# escape possible meta characters and join
my $sub = join '|', map { quotemeta } @subs;

# replace in the array
s/($sub)/$1-DATA/g for @array;

如果您不想直接在@array使用map而不是for更改值。 例如:my @new = map s/($sub)/$1-DATA/g, @array;