2

对不起,如果它是一个重复的主题,但我在论坛内搜索过,我只发现了类似但不相同的问题。

我的问题是:

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

@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 将匹配第一个和第二个元素,Minnesota 只匹配最后一个元素)。

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

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

谢谢!

4

3 回答 3

2

你可以这样替换:

s/(Annie|22|Minnesota)/\1-DATA/g
于 2013-04-04T12:47:29.467 回答
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;
于 2013-04-04T13:07:27.607 回答
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;

于 2013-04-04T13:35:05.060 回答