NAME
File::Random - Perl module for random selecting of a file
SYNOPSIS
use File::Random qw/random_file/;
my $fname = random_file();
my $fname2 = random_file(-dir => $dir);
my $random_gif = random_file(-dir => $dir,
-check => qr/\.gif$/,
-recursive => 1);
my $no_exe = random_file(-dir => $dir,
-check => sub {! -x});
DESCRIPTION
This module simplifies the routine job of selecting a random file. (As you can find at CGI scripts).
It's done, because it's boring (and errorprone), always to write something like
my @files = (<*.*>);
my $randf = $files[rand @files];
or
opendir DIR, " ... " or die " ... ";
my @files = grep {-f ...} (readdir DIR);
closedir DIR;
my $randf = $files[rand @files];
It also becomes very boring and very dangerous to write randomly selection for subdirectory searching with special check-routines.
FUNCTION random_file
Returns a randomly selected file(name) from the specified directory If the directory is empty, undef will be returned. There 3 options:
my $file = random_file(
-dir => $dir,
-check => qr/.../, # or sub { .... }
-recursive => 1 # or 0
);
- -dir
-
Specifies the directory where file has to come from.
Is the -dir option missing, a random file from the current directory will be used. That means '.' is the default for the -dir option.
- -check
-
With the -check option you can either define a regex every filename has to follow, or a sub routine which gets the filename as argument.
Note, that -check doesn't accept anything else than a regexp or a subroutine. A string like '/.../' won't work. I still work on that.
The default is no checking (undef).
- -recursive
-
Enables, that subdirectories are scanned for files, too. Every file, independent from its position in the file tree, has the same chance to be choosen.
Every true value sets recursive behaviour on, every false value switches off. The default if false (undef).
Note, that I programmed the recursive routine very defendly (using File::Find). So switch recursive on slowers the program a bit :-)
EXPORT
None by default.
You can export the function random_file with use File::Random qw/random_file/;
or with the more simple use File::Random qw/:all/;
.
TODO
I think, I'll need to expand the options. Instead of only one directory, it should be possible to take a random file from some directories.
The -check option doesn't except a string looking like regexp. In future versions there should be the possibility of passing a string like '/..../' instead of the regexp qr/.../';
To create some aliases for the params is a good idea, too. I thought to make -d == -dir, -r == -recursive and -c == -check. (Only a lazy programmer is a good programmer).
So I want to make it possible to write:
my $fname = random_file( -dir => '...', -recursive => 1, -check => '/\.html/' );
or even:
my $fname = random_file( -d => [$dir1, $dir2, $dir3, ...], -r => 1, -c => sub {-M < 7} );
I also want to add a method content_of_random_file
and random_line
.
The next thing, I'll implement is the content_of_random_file method.
Just have a look some hours later.
BUGS
Oh, I hope none. I still have more test lines than function code.
Well, but because I want some random data, it's a little bit hard to test. So a test could be wrong, allthough everything is O.K.. To avoid it, I let many tests run, so that the chances for misproofing should be < 0.0000000001% or so. Even it has the disadvantage that the tests need really long :-(
COPYRIGHT
This Program is free software. You can change or redistribute it under the same condition as Perl itself.
Copyright (c) 2002, Janek Schleicher, <bigj@kamelfreund.de>
AUTHOR
Janek Schleicher, <bigj@kamelfreund.de>