use strict; use warnings; my $input = 'ABC---'; sub insert { my( $sofar, $chars, $dashes ) = @_; print "$sofar\n" and return unless @$chars or @$dashes; insert( $sofar . $$chars[0], [ @$chars[ 1..@$chars-1] ], [ @$dashes ] ) if @$chars; insert( $sofar . $$dashes[0], [ @$chars ], [ @$dashes[ 1..@$dashes-1 ] ] ) if @$dashes; } insert( '', [ $input =~ /[^-]/g ], [ $input =~ /-/g ] );