Итак, мой Perl-скрипт в основном берет строку, а затем пытается очистить ее, выполнив многократный поиск и заменив ее, например:
$text =~ s/<[^>]+>/ /g;
$text =~ s/\s+/ /g;
$text =~ s/[\(\{\[]\d+[\(\{\[]/ /g;
$text =~ s/\s+[<>]+\s+/\. /g;
$text =~ s/\s+/ /g;
$text =~ s/\.*\s*[\*|\#]+\s*([A-Z\"])/\. $1/g; # replace . **** Begin or . #### Begin or ) *The
$text =~ s/\.\s*\([^\)]*\) ([A-Z])/\. $1/g; # . (blah blah) S... => . S...
Как вы видите, я имею дело с неприятным html и должен превзойти его.
Я надеюсь, что есть более простой, эстетически привлекательный способ сделать это. У меня есть около 50 строк, которые выглядят так же, как и выше.
Я решил одну версию этой проблемы, используя хеш, где ключом является комментарий, а хешем является выражение reg, например:
%rxcheck = (
'time of day'=>'\d+:\d+',
'starts with capital letters then a capital word'=>'^([A-Z]+\s)+[A-Z][a-z]',
'ends with a single capital letter'=>'\b[A-Z]\.'
}
И вот как я это использую:
foreach my $key (keys %rxcheck) {
if($snippet =~ /$rxcheck{ $key }/g){ blah blah }
}
Проблема возникает, когда я пробую свои силы в хеше, где ключом является выражение, и оно указывает на то, что я хочу заменить на него ... и в нем есть 1 или 2 доллара.
%rxcheck2 = (
'(\w) \"'=>'$1\"'
}
Выше указано это для:
$snippet =~ s/(\w) \"/$1\"/g;
Но я не могу передать часть $ 1 в регулярное выражение (я думаю, что это правильное слово ... кажется, что $ 1 интерпретируется, хотя я использовал знаки '). Таким образом, это приводит к:
if($snippet =~ /$key/$rxcheck2{ $key }/g){ }
И это не работает.
Итак, 2 вопроса:
Легко: Как мне обработать большое количество регулярных выражений в легко редактируемом виде, чтобы я мог изменять и добавлять их, просто не обрезая и не вставляя строку раньше?
Сложнее: как мне обрабатывать их, используя хеш (или массив, если у меня есть, скажем, несколько частей, которые я хочу включить, например, 1) часть для поиска, 2) замена 3) комментарий, 4) глобальные / нечувствительные к регистру модификаторы ), если это на самом деле самый простой способ сделать это?
Спасибо за вашу помощь -