use XML::RSS (); my $rss_content = "RSS goes here"; my @replace = ( ['\&(\s)', '"&$1"'], # '&' followed by space ['(\s)>', '"$1>"'], # '>' with preceding space ['\&', '"&"'], # All '&' ); my($data, $rss); PARSE: while (my $repl = shift @replace) { $rss = XML::RSS->new; $data = eval { $rss->parse($rss_content) } and last PARSE; } continue { $content =~ s/$repl->[0]/eval($repl->[1])/ge; } die unless $data;