sub unroll { my @x = $_[0] =~ /(?:^|@)((?:##|#@|[^#@])*)/g; for(@x){ $_ =~ s/##/#/g; $_ =~ s/#@/@/g; } @x } #### unroll("#@##@###@####@#####@") #### '@#', '#@##', '##@', #### unroll("@@#@##@###@####@#####@") #### '', '', '@#', '#@##', '##@' #### sub my_escape { my $x = shift; $x =~ s/#/##/g; $x =~ s/@/#@/g; $x } sub my_join { join('@',@_) } #### my_join(map{my_escape($_)}('','','@#','#@##','##@',)) #### '@@#@##@###@####@#####@'