Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 具有多行匹配的Perl正则表达式问题_Regex_Perl - Fatal编程技术网

Regex 具有多行匹配的Perl正则表达式问题

Regex 具有多行匹配的Perl正则表达式问题,regex,perl,Regex,Perl,我的目标是在多行上提取一个大字符串的一部分。这个字符串是a。 提取的子字符串调用它B将添加一个新字符串,新的子字符串是C。 最后,在A中,我将用C替换B 下面是我的代码和一些解释…我的子字符串B如下所示: $B = 'define category "Allowed"\n\twww.toto.com\n\twww.tata.com\n\t{...}\nend category "Allowed $A =~ s/$items[$#items-1]/$items[$#items-1]\n\t$it

我的目标是在多行上提取一个大字符串的一部分。这个字符串是a。 提取的子字符串调用它B将添加一个新字符串,新的子字符串是C。 最后,在A中,我将用C替换B

下面是我的代码和一些解释…我的子字符串B如下所示:

$B = 'define category "Allowed"\n\twww.toto.com\n\twww.tata.com\n\t{...}\nend category "Allowed
$A =~ s/$items[$#items-1]/$items[$#items-1]\n\t$items[$#items]/;
这是一个网站列表。在现实中,字符串更大——里面有数百个网站 它以允许定义类别开始,以允许结束类别结束。 网站之间用\n\t分隔

我想所有的网址,所以我这样做

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" ; }
…它从不匹配…我错过了什么

由于$list是从模式匹配中提取的,所以它必须与原始字符串匹配,不是吗

我找到了另一个选择,但它很脏: 我仅用最后一个网站和新网站替换最后一个网站,如下所示:

$B = 'define category "Allowed"\n\twww.toto.com\n\twww.tata.com\n\t{...}\nend category "Allowed
$A =~ s/$items[$#items-1]/$items[$#items-1]\n\t$items[$#items]/;
这很管用,但我不满意

问题是$A没有被修改

我尝试了代码,它正确地修改了$A。我尝试了以下$A和$B:


请显示更多的代码

我上传了我所有的代码。唯一的区别是字符串更大。我做的另一个测试是:在文件中打印$A,在另一个文件中打印$list。然后我在$A中删除了所有不匹配的内容,即$list前后的所有内容。我在这些文件上启动了一个diff命令,没有区别……好的,你能上传复制问题的最小字符串$a吗?不幸的是,我不能,因为它与我的工作有关。但是如果你认为我的代码很好,那么$A字符串中肯定有一些棘手的地方。我会努力找到特刊的内容?我看到我的网站上有大约20%example@StephaneProud谢谢,今天晚些时候我会看一看。你也可以给我发电子邮件,告诉我你在我的个人资料中找到我的电子邮件的例子。我找到了。以下网站是问题所在www.parashift.com/c++-faq-lite/compiler-dependencies.html。当它在$A中时,它在$list中被很好地提取出来。打印会确认它,但如果我尝试$A=~m/$list/s{print MATCH\n;},它就不会打印匹配。当我从$A中删除网站时,一切正常。+字符是个问题,我怎样才能摆脱它