2010-10-11 3 views
0

Я пытаюсь написать некоторый Perl, чтобы преобразовать некоторый текст на основе HTML в формат MediaWiki и решить следующую проблему: я хочу искать и заменять в разделенном подразделе какого-либо текста и задавался вопросом, знал ли кто-нибудь о аккуратном способе сделай это. Мой входной поток что-то вроде:Как я могу манипулировать только частью строки Perl?

Please mail <a href="mailto:[email protected]&amp;Subject=Please help&amp;Body=Please can some one help me out here">support.</a> if you want some help. 

и я хочу изменить Please help и Please can some one help me out here к Please%20help и Please%20can%20some%20one%20help%20me%20out%20here соответственно, без изменения каких-либо других местах, на линии.

Естественно, мне также нужно иметь возможность справиться с более чем одной такой ссылкой на линии, поэтому сращивание не является таким хорошим вариантом.

Я внимательно изучил сайты учебников Perl (это не мой первый язык), но в качестве примера не встретил ничего подобного. Может ли кто-нибудь посоветовать элегантный способ сделать это?

+0

Из темы Я думал, что ответ будет «Использовать' substr() 'как lvalue." Приятно видеть вопрос X/Y, который на самом деле говорит вам, что такое Y. –

+0

Я не мог думать о лучшей строке темы сразу, поэтому я просто сопоставлял оригинал с намерением. –

+0

@brian d foy: Из интереса, что было не так с исходным предметом? –

ответ

5

Ваша задача состоит из двух частей. Найдите и замените URI mailto - используйте для этого модуль разбора HTML. Этот раздел полностью посвящен переполнению стека.

Другая часть - канонизировать URI. Для этой цели подходит модуль URI.

use URI::mailto; 
my @hrefs = ('mailto:[email protected]&amp;Subject=Please help&amp;Body=Please can some one help me out here'); 
print URI::mailto->new($_)->as_string for @hrefs; 
__END__ 
mailto:[email protected]&amp;Subject=Please%20help&amp;Body=Please%20can%20some%20one%20help%20me%20out%20here 
+0

А, я думал, вы могли бы сказать что-то подобное. Я надеялся, что это будет простой простой лайнер в Perl! Я не пояснил, что входные данные на самом деле очень старые TWiki со встроенными тегами HTML. Я не уверен, что анализатор HTML сделает из этого, но я собираюсь дать его, и канонизацию, попробуйте. Спасибо за совет. –

-3

Почему вы не просто ищете тег «Body =» до кавычек и заменяете каждое пространство% 20.

Я бы даже не использовал регулярные выражения для этого, так как я не считаю их полезными ни для чего, кроме массовых изменений, когда все на линии меняется.

Простой цикл может быть лучшим решением.

+0

Если вы «не найдете их полезными ни для чего, кроме массовых изменений, где все в строке меняется», то я предлагаю вам научиться более тонкому использованию их, чтобы использовать их силу. –

Смежные вопросы