NAME

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

SYNOPSIS

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

DESCRIPTION

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

foobar
foobaz

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 & LICENSE

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).

AUTHOR

Algorithm, Code: Rick Reed, Ryan Hamilton, Greg Olszewski. Module: 2008, Mike Schilli <cpan@perlmeister.com>