X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FFile%2FBasename.pm;h=887c7bae4a9fb13cbae95bf12172c86e72665661;hb=a8bf0cad84ba0e8477c2b4b1b02a57dbd376a155;hp=94aac2dd44e272406e86cd9abed234bb46e2e133;hpb=3e2f796abf3f79e1ab191424e6c63f33a4ee4497;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/File/Basename.pm b/lib/File/Basename.pm index 94aac2d..887c7ba 100644 --- a/lib/File/Basename.pm +++ b/lib/File/Basename.pm @@ -12,12 +12,13 @@ dirname - extract just the directory from a path use File::Basename; - ($name,$path,$suffix) = fileparse($fullname,@suffixlist) + ($name,$path,$suffix) = fileparse($fullname,@suffixlist); + $name = fileparse($fullname,@suffixlist); fileparse_set_fstype($os_string); $basename = basename($fullname,@suffixlist); $dirname = dirname($fullname); - ($name,$path,$suffix) = fileparse("lib/File/Basename.pm","\.pm"); + ($name,$path,$suffix) = fileparse("lib/File/Basename.pm",qr{\.pm}); fileparse_set_fstype("VMS"); $basename = basename("lib/File/Basename.pm",".pm"); $dirname = dirname("lib/File/Basename.pm"); @@ -60,7 +61,8 @@ B contains everything up to and including the last directory separator in the input file specification. The remainder of the input file specification is then divided into B and B based on the optional patterns you specify in C<@suffixlist>. Each element of -this list is interpreted as a regular expression, and is matched +this list can be a qr-quoted pattern (or a string which is interpreted +as a regular expression), and is matched against the end of B. If this succeeds, the matching portion of B is removed and prepended to B. By proper use of C<@suffixlist>, you can remove file types or versions for examination. @@ -69,6 +71,8 @@ You are guaranteed that if you concatenate B, B, and B together in that order, the result will denote the same file as the input file specification. +In scalar context, fileparse() returns only the B part of the filename. + =back =head1 EXAMPLES @@ -76,7 +80,7 @@ file as the input file specification. Using Unix file syntax: ($base,$path,$type) = fileparse('/virgil/aeneid/draft.book7', - '\.book\d+'); + qr{\.book\d+}); would yield @@ -87,7 +91,7 @@ would yield Similarly, using VMS syntax: ($name,$dir,$type) = fileparse('Doc_Root:[Help]Rhetoric.Rnh', - '\..*'); + qr{\..*}); would yield @@ -129,18 +133,19 @@ directory name to be F<.>). # not be available. BEGIN { unless (eval { require re; }) - { eval ' sub re::import { $^H |= 0x00100000; } ' } + { eval ' sub re::import { $^H |= 0x00100000; } ' } # HINT_RE_TAINT import re 'taint'; } -use 5.005_64; +use 5.006; +use warnings; our(@ISA, @EXPORT, $VERSION, $Fileparse_fstype, $Fileparse_igncase); require Exporter; @ISA = qw(Exporter); @EXPORT = qw(fileparse fileparse_set_fstype basename dirname); -$VERSION = "2.6"; +$VERSION = "2.73"; # fileparse_set_fstype() - specify OS-based rules used in future @@ -165,6 +170,10 @@ sub fileparse_set_fstype { sub fileparse { my($fullname,@suffices) = @_; + unless (defined $fullname) { + require Carp; + Carp::croak("fileparse(): need a valid pathname"); + } my($fstype,$igncase) = ($Fileparse_fstype, $Fileparse_igncase); my($dirpath,$tail,$suffix,$basename); my($taint) = substr($fullname,0,0); # Is $fullname tainted? @@ -180,8 +189,14 @@ sub fileparse { ($dirpath,$basename) = ($fullname =~ /^((?:.*[:\\\/])?)(.*)/s); $dirpath .= '.\\' unless $dirpath =~ /[\\\/]\z/; } + elsif ($fstype =~ /^os2/i) { + ($dirpath,$basename) = ($fullname =~ m#^((?:.*[:\\/])?)(.*)#s); + $dirpath = './' unless $dirpath; # Can't be 0 + $dirpath .= '/' unless $dirpath =~ m#[\\/]\z#; + } elsif ($fstype =~ /^MacOS/si) { ($dirpath,$basename) = ($fullname =~ /^(.*:)?(.*)/s); + $dirpath = ':' unless $dirpath; } elsif ($fstype =~ /^AmigaOS/i) { ($dirpath,$basename) = ($fullname =~ /(.*[:\/])?(.*)/s); @@ -195,6 +210,7 @@ sub fileparse { my $devspec = $1; my $remainder = $3; ($dirpath,$basename) = ($remainder =~ m#^(.*/)?(.*)#s); + $dirpath ||= ''; # should always be defined $dirpath = $devspec.$dirpath; } $dirpath = './' unless $dirpath; @@ -212,8 +228,8 @@ sub fileparse { } $tail .= $taint if defined $tail; # avoid warning if $tail == undef - wantarray ? ($basename . $taint, $dirpath . $taint, $tail) - : $basename . $taint; + wantarray ? ($basename .= $taint, $dirpath .= $taint, $tail) + : ($basename .= $taint); } @@ -247,14 +263,7 @@ sub dirname { } $dirname .= ":" unless $dirname =~ /:\z/; } - elsif ($fstype =~ /MSDOS/i) { - $dirname =~ s/([^:])[\\\/]*\z/$1/; - unless( length($basename) ) { - ($basename,$dirname) = fileparse $dirname; - $dirname =~ s/([^:])[\\\/]*\z/$1/; - } - } - elsif ($fstype =~ /MSWin32/i) { + elsif ($fstype =~ /MS(DOS|Win32)|os2/i) { $dirname =~ s/([^:])[\\\/]*\z/$1/; unless( length($basename) ) { ($basename,$dirname) = fileparse $dirname;