Извините, если это не достойно переполнения стека, но я в тупике.Вот мой код:
#Search tmpData for a <whack> tag and replace with REPLACEMENTSTRING (this works)
$tmpData =~ s/<\s*whack\s+([^\/>]*)(\/?>)/"$REPLACEMENTSTRING"/i;
if($defaultData ne '') {
print "pre $1 And $2... '$&'\n";
#Search for data inside <whack> tag and closing tag </whack> and remove them.
$tmpData =~ s/$defaultData<\/whack>$//;
print "FOUND $1 And $2... '$&'\n";
Для тех, кто не знает, $&
показывает соответствие регулярному выражению.Проблема в том, что второе регулярное выражение, по-видимому, вообще не выполняется: последний оператор print отображает все значения из первого регулярного выражения.Вы ожидаете, что $&
изменит здесь.Правильно?
Мои тестовые данные: $tmpData is: yo "WHACKREPLACEMENT-idname2"helloworld</whack>
после первого регулярного выражения.$defaultData is: helloworld
Я попытался вытащить этот код из основного скрипта в тестовый файл, который не является строгим, и он работал: (
Что происходит ?! Спасибо!
РЕДАКТИРОВАТЬ Я не был уверен, как сделать это более понятным, поэтому я решил опубликовать вывод из моего отладчика в точке ошибки:
main: :( c: \exec \ webwhack.pl: 109): $ tmpData = ~ s / $ defaultData $ //;
DB <2> p $ tmpData, $ defaultData
"WHACKATAG2837293REPLACEMENT-idname2" removeMe
removeMe
DB <3> n
main: :( c: \ exec \ webwhack.pl: 110): print "FOUND $ 1 And $ 2 ... '$ &' \ n";
DB <3> p $ tmpData,$ defaultData
"WHACKATAG2837293REPLACEMENT-idname2" removeMe
removeMe
Таким образом, вы можете видеть, что входя вв конце строки существует регулярное выражение "removeMe". Выходит из регулярного выражения, как будто ничего не изменилось:(
EDIT2
Следует также отметить, что все эти операторы заключены в:
while( $tmpData =~ m/<\s*whack\s+([^\/>]*)(\/?>)/ig) { ... }
цикл