很抱歉,如果这是一个重复的主题,但我在论坛内搜索过,我只发现了类似但不完全相同的问题。
我的问题是:
我有一个像这样的字符串数组:
@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的正则表达式。
谢谢!
答案 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;