summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMichael G. Schwern <schwern@pobox.com>2005-07-07 08:38:32 -0700
committerSteve Hay <SteveHay@planit.com>2005-07-08 09:48:50 +0000
commit08ea998e8be5a42c57497ff314325487510065d6 (patch)
treee5c7eb2092f3d86511ecb531ab96da92864c1abe /lib
parent08bc7695a2f08a85d93cf60f86512524ac215df2 (diff)
downloadperl-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.pm29
-rwxr-xr-xlib/File/Basename.t13
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