String::Random - Perl module to generate random strings based on a pattern
  use String::Random;
  $foo = new String::Random;
  print $foo->randregex('\d\d\d'); # Prints 3 random digits
  print $foo->randpattern("...");  # Prints 3 random printable characters
or
  use String::Random qw(random_regex random_string);
  print random_regex('\d\d\d'); # Also prints 3 random digits
  print random_string("...");   # Also prints 3 random printable characters
This module makes it trivial to generate random strings.
As an example, let's say you are writing a script that needs to generate a random password for a user. The relevant code might look something like this:
  use String::Random;
  $pass = new String::Random;
  print "Your password is ", $pass->randpattern("CCcc!ccn"), "\n";
This would output something like this:
Your password is UDwp$tj5
For another example, let's say you were going to generate a
  use String::Random;
  $pass = new String::Random;
  print "Your password is ", $pass->randpattern("CCcc!ccn"), "\n";
The pre-defined patterns (for use with randpattern() and random_pattern())
are as follows:
  c        Any lowercase character [a-z]
  C        Any uppercase character [A-Z]
  n        Any digit [0-9]
  !        A punctuation character [~`!@$%^&*()-_+={}[]|\:;"'.<>?/#,]
  .        Any of the above
  s        A "salt" character [A-Za-z0-9./]
  b        Any binary data
These can be modified, but if you need a different pattern it is better to
create another pattern, possibly using one of the pre-defined as a base.
For example, if you wanted a pattern A that contained all upper and lower
case letters ([A-Za-z]), the following would work:
  $foo = new String::Random;
  $foo->{'A'} = [ 'A'..'Z', 'a'..'z' ];
or
  $foo = new String::Random;
  $foo->{'A'} = [ @{$foo->{'C'}}, @{$foo->{'c'}} ];
The random_string function, described below, has an alternative interface for adding patterns.
Create a new String::Random object.
Optionally a parameter max can be included to specify the maximum number
of characters to return for * and other regular expression patters that
don't return a fixed number of characters.
The randpattern method returns a random string based on the concatenation of all the pattern strings in the list.
It will return a list of random strings corresponding to the pattern strings when used in list context.
The randregex method returns a random string that will match the regular expression passed in the list argument.
Please note that the arguments to randregex are not real regular expressions. Only a small subset of regular expression syntax is actually supported. So far, the following regular expression elements are supported:
  \w    Alphanumeric + "_".
  \d    Digits.
  \W    Printable characters other than those in \w.
  \D    Printable characters other than those in \d.
  .     Printable characters.
  []    Character classes.
  {}    Repetition.
  *     Same as {0,}.
  ?     Same as {0,1}.
  +     Same as {1,}.
Regular expression support is still somewhat incomplete. Currently special characters inside [] are not supported (with the exception of "-" to denote ranges of characters). The parser doesn't care for spaces in the "regular expression" either.
When called with a single scalar argument, random_string returns a random string using that scalar as a pattern. Optionally, references to lists containing other patterns can be passed to the function. Those lists will be used for 0 through 9 in the pattern (meaning the maximum number of lists that can be passed is 10). For example, the following code:
  print random_string("0101",
                      ["a", "b", "c"],
                      ["d", "e", "f"]), "\n";
would print something like this:
cebd
This is Bug Free(TM) code. (At least until somebody finds one...)
Steven Pritchard <steve@silug.org>
perl(1).