Проблема с регулярным выражением в Perl при совпадении нескольких строк - PullRequest
0 голосов
/ 04 июля 2019

Моя цель - извлечь часть большой строки в несколько строк (эта строка - 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" ; }

... он никогда не печатает "МАТЧ" ... Чего мне не хватает?

Поскольку $ list извлекается из сопоставления с образцом, он должен совпадать с исходной строкой, нет?

Я нашел альтернативу, но она грязная: Я заменяю только последний веб-сайт последним веб-сайтом И новым веб-сайтом следующим образом:

$A =~ s/$items[$#items-1]/$items[$#items-1]\n\t$items[$#items]/;

Это работает, но меня это не устраивает.

1 Ответ

1 голос
/ 04 июля 2019

Проблема в том, что $ 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'; 

Пожалуйста, покажите больше вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...