Globby.pm   [plain text]


package Globby;

# More-portable but limited glob().  It does what we need.

use Exporter;
use vars qw(@ISA @EXPORT);

@ISA    = qw(Exporter);
@EXPORT = qw(globby);

sub globby {
    my $globpath = shift;    # full glob
    my %r = ('.'=>'\.',
	     '*'=>'.*',
	     '?'=>'.');

    # Get directory and regexp:
    my ($dir, $glob) = ($globpath =~ m{^(.*?)/?([^/]+\Z)});
    defined($dir) or $dir = '';
    my $re = $glob; $re =~ s{([\.\*\?])}{$r{$1}}g;

    # Get files which match pattern:
    my @f;
    if (opendir DIR, $dir) {
	@f = grep /^$re\Z/, sort(readdir(DIR));
	closedir DIR;
    }

    # Return as full paths:
    map { ($dir ne '') ? "$dir/$_" : $_}  @f;
}
1;