String::Glob::Permute(3) Expand {foo,bar,baz}[2-4] style string globs


use String::Glob::Permute qw( string_glob_permute );
my $pattern = "host{foo,bar,baz}[2-4]";
for my $host (string_glob_permute( $pattern )) {
print "$host\n";
# hostfoo2
# hostbar2
# hostbaz2
# hostfoo3
# hostbar3
# hostbaz3
# hostfoo4
# hostbar4
# hostbaz4


The "string_glob_permute()" function provided by this module expands glob-like notations in text strings and returns all possible permutations.

For example, to run a script on hosts host1, host2, and host3, you might write

    @hosts = string_glob_permute( "host[1-3]" );

and get a list of hosts back: (``host1'', ``host2'', ``host3'').

Ranges with gaps are also supported, just separate the blocks by commas:

    @hosts = string_glob_permute( "host[1-3,5,9]" );

will return (``host1'', ``host2'', ``host3'', ``host5'', ``host9'').

And, finally, using curly brackets and comma-separated lists of strings, as in

    @hosts = string_glob_permute( "host{dev,stag,prod}" );

you'll get permutations with each of the alternatives back: (``hostdev'', ``hoststag'', ``hostprod'') back.

All of the above can be combined, so

    my @hosts = string_glob_permute( "host{dev,stag}[3-4]" );

will result in the permutation (``hostdev3'', ``hoststag3'', ``hostdev4'', ``hoststag4'').

The patterns allow numerical ranges only [1-3], no string ranges like [a-z]. Pattern must not contain blanks.

The function returns a list of string permutations on success and "undef" in case of an error. A warning is also issued if the pattern cannot be recognized.

Zero padding

An expression like

    @hosts = string_glob_permute( "host[8-9,10]" );
      # ("host8", "host9", "host10")

will expand to (``host8'', ``host9'', ``host10''), featuring no zero-padding to create equal-length entries. If you want (``host08'', ``host09'', ``host10''), instead, pad all integers in the range expression accordingly:

    @hosts = string_glob_permute( "host[08-09,10]" );
      # ("host08", "host09", "host10")

Note on Perl's internal Glob Permutations

Note that there's a little-known feature within Perl itself that does something similar, for example

    print "$_\n" for < foo{bar,baz} >;

will print


if there is no file in the current directory that matches that pattern. String::Glob::Permute, on the other hand, expands irrespective of matching files, by simply always returning all possible permutations. It's also worth noting that Perl's internal Glob Permutation does not support String::Glob::Permute's [m,n] or [m-n] syntax.


Copyright (c) 2008 Yahoo! Inc. All rights reserved. The copyrights to the contents of this file are licensed under the Perl Artistic License (ver. 15 Aug 1997).


Algorithm, Code: Rick Reed, Ryan Hamilton, Greg Olszewski. Module: 2008, Mike Schilli <[email protected]>