sub parse_bin { my $save = pos; my ($size_sz) = /\G \# (\d) /xgc or goto BACKTRACK; my ($bin_sz) = /\G (\d{$size_sz}) /xgc or goto BACKTRACK; my ($bin) = /\G .{$bin_sz} /xgcs or goto BACKTRACK; return $bin; BACKTRACK: pos = $save; return (); } my $outputText = ''; for ($inputText) { pos = 0; for (;;) { if (my ($bin) = parse_bin()) { $outputText .= ''; next; } if (/\G (.[^#]+ ) /xgcs) { $outputText .= $1; next; } last; } }