我的目标是在多行上提取大字符串的一部分(此字符串为A)。 提取的子字符串(称为B)将添加新的字符串,新的子字符串为C。 最后在A中,我将B替换为C。
这是我的代码,有一些解释...我的子字符串B看起来像这样:
$B = 'define category "Allowed"\n\twww.toto.com\n\twww.tata.com\n\t{...}\nend category "Allowed
这是网站列表。 (实际上,字符串更大-内部有数百个网站)
它以define category "Allowed"
开头,以end category "Allowed"
结尾。
网站之间用“ \ n \ t”分隔。
我想要所有URL,所以我这样做
if ( $A =~ m/define category "Allowed"\n\t(.*)\nend category "Allowed"/s) {
my $list = $1 ;
然后我将列表放入阵列
my @items = split /\n\t/, $list ;
然后,我添加我的新网站“ www.titi.com”
push @items, "www.titi.com" ;
然后我创建一个新列表
my $new_list = join "\n\t", @items;
最后,我将旧列表替换为新列表
$A =~ s/$list/$new_list/;
}
问题在于$ A未被修改(未添加新网站)。
有关信息,我使用数组,因为此函数添加了一个新网站,但是我也需要能够从列表中删除网站,因此(对我而言)使用数组而不是处理字符串更容易(对我而言)直接。
我进行了一些调查,发现当我提取“ $ list”然后验证它是否与$ A匹配时,结果是否定的:
if ( $A =~ m/$list/s ) { print "MATCH\n" ; }
...它从不打印“ MATCH” ...我想念什么?
由于$ list是从模式匹配中提取的,因此它必须与原始字符串匹配,否?
我找到了另一种选择,但是很脏: 我只会将上一个网站替换为上一个网站和这样的新网站:
$A =~ s/$items[$#items-1]/$items[$#items-1]\n\t$items[$#items]/;
这行得通,但是我不满意。
答案 0 :(得分:1)
问题在于$ A未被修改...
我尝试了该代码,并正确地修改了$A
。我尝试使用以下$A
和$B
:
my $B = 'define category "Allowed"'
. "\n\twww.toto.com\n\twww.tata.com\n\t{...}\nend category "
. '"Allowed"';
my $A = 'xxxxxxxxxxxxx' . $B . 'yyyyyyyyyyyyyyyyyyyyyyyyy';
请显示更多代码。