package XML::Liberal::Remedy::LowAsciiChars; use strict; my @low_ascii = (0..8, 11..12, 14..31, 127); my $dec_rx = do { my $pat = join '|', @low_ascii; qr/$pat/; }; my $hex_rx = do { my $pat = join '|', map { sprintf '%x', $_ } @low_ascii; qr/$pat/i; }; # optimized to fix all errors in one apply() call sub apply { my $class = shift; my($driver, $error, $xml_ref) = @_; return 0 if $error->message !~ /^parser error : xmlParseCharRef: invalid xmlChar value $dec_rx\b/; return 1 if $$xml_ref =~ s{&#(?:0*$dec_rx|[xX]0*$hex_rx);}{}g; Carp::carp("Can't find low ascii bytes, error was: ", $error->summary); return 0; } 1;