Моя цель - извлечь часть большой строки в несколько строк (эта строка - 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]/;
Это работает, но меня это не устраивает.