use strict; use warnings; use Data::Dumper; # delimiter is X my $escaped_str = 'Xa\Xdc\\bXc\\\\XdXe'; my @a = (); my $i = 0; foreach (split /(\\.)|X/, $escaped_str) { defined $_ ? do { $a[$i] .= $_ } : do {$i++ } } print Dumper(\@a); #### $VAR1 = [ '', 'a\\Xdc\\b', 'c\\\\', 'd', 'e' ];