sub expand { local $_ = shift; if ( /^(.*?)\{([^}]+)\}(.*)$/ ) { my( $pre, $spec, $post ) = ( $1, $2, $3 ); return map expand($pre.$_.$post), split /,/, $spec } if ( /^(.*?)\[(\d+):(\d+)\](.*)$/ ) { my( $pre, $lo, $hi, $post ) = ( $1, $2, $3, $4 ); return map expand($pre.$_.$post), $lo .. $hi } $_ }