diff options
author | Michael G. Schwern <schwern@pobox.com> | 2005-07-07 08:38:32 -0700 |
---|---|---|
committer | Steve Hay <SteveHay@planit.com> | 2005-07-08 09:48:50 +0000 |
commit | 08ea998e8be5a42c57497ff314325487510065d6 (patch) | |
tree | e5c7eb2092f3d86511ecb531ab96da92864c1abe /lib | |
parent | 08bc7695a2f08a85d93cf60f86512524ac215df2 (diff) | |
download | perl-08ea998e8be5a42c57497ff314325487510065d6.tar.gz |
basename() and suffixes
Message-ID: <20050707223832.GA4782@windhund.schwern.org>
p4raw-id: //depot/perl@25097
Diffstat (limited to 'lib')
-rw-r--r-- | lib/File/Basename.pm | 29 | ||||
-rwxr-xr-x | lib/File/Basename.t | 13 |
2 files changed, 36 insertions, 6 deletions
diff --git a/lib/File/Basename.pm b/lib/File/Basename.pm index cc6ba5853a..c89c7527f9 100644 --- a/lib/File/Basename.pm +++ b/lib/File/Basename.pm @@ -157,9 +157,9 @@ sub fileparse { } - my($tail, $suffix); + my $tail = ''; + my $suffix = ''; if (@suffices) { - $tail = ''; foreach $suffix (@suffices) { my $pat = ($igncase ? '(?i)' : '') . "($suffix)\$"; if ($basename =~ s/$pat//s) { @@ -170,7 +170,7 @@ sub fileparse { } # Ensure taint is propgated from the path to its pieces. - $tail .= $taint if defined $tail; # avoid warning if $tail == undef + $tail .= $taint; wantarray ? ($basename .= $taint, $dirpath .= $taint, $tail) : ($basename .= $taint); } @@ -202,15 +202,34 @@ quoted. my $filename = basename("/foo/bar/baz.txt", ".txt"); my $filename = fileparse("/foo/bar/baz.txt", qr/\Q.txt\E/); +Also note that in order to be compatible with the shell command, +C<basename()> does not strip off a suffix if it is identical to the +remaining characters in the filename. + =cut sub basename { my($path) = shift; + # From BSD basename(1) + # The basename utility deletes any prefix ending with the last slash `/' + # character present in string (after first stripping trailing slashes) _strip_trailing_sep($path); - my($basename, $dirname) = fileparse( $path, map("\Q$_\E",@_) ); - $basename = $dirname unless length $basename; + + my($basename, $dirname, $suffix) = fileparse( $path, map("\Q$_\E",@_) ); + + # From BSD basename(1) + # The suffix is not stripped if it is identical to the remaining + # characters in string. + if( length $suffix and !length $basename ) { + $basename = $suffix; + } + + # Ensure that basename '/' == '/' + if( !length $basename ) { + $basename = $dirname; + } return $basename; } diff --git a/lib/File/Basename.t b/lib/File/Basename.t index 84e1a4e92d..0d3b633669 100755 --- a/lib/File/Basename.t +++ b/lib/File/Basename.t @@ -5,7 +5,7 @@ BEGIN { @INC = '../lib'; } -use Test::More tests => 60; +use Test::More tests => 64; BEGIN { use_ok 'File::Basename' } @@ -142,6 +142,17 @@ can_ok( __PACKAGE__, qw( basename fileparse dirname fileparse_set_fstype ) ); } +### basename(1) sez: "The suffix is not stripped if it is identical to the +### remaining characters in string" +{ + fileparse_set_fstype('Unix'); + is(basename('.foo'), '.foo'); + is(basename('.foo', '.foo'), '.foo'); + is(basename('.foo.bar', '.foo'), '.foo.bar'); + is(basename('.foo.bar', '.bar'), '.foo'); +} + + ### Test tainting { # The empty tainted value, for tainting strings |