Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Weird File::Basename::basename

by McA (Priest)
on Mar 26, 2013 at 13:55 UTC ( #1025525=perlquestion: print w/ replies, xml ) Need Help??
McA has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks,

just stumbled on the following behaviour of File::Basename::basename.

#!/usr/bin/perl use 5.010; use strict; use warnings; use File::Basename; say "$File::Basename::VERSION\n"; my $filename = ''; say $filename, ' - basename($filename) -> ', basename($filename); say $filename, ' - dirname($filename) -> ', dirname($filename);
The basename of an empty string is ./ which I really didn't expect. To cite the documentation:
dirname() and basename() emulate the behaviours, and quirks, of the shell and C functions of the same name. See each function's documentation for details.
But basename of empty string on bash is an empty string. The same for C library basename.

Is this a bug?

McA

Comment on Weird File::Basename::basename
Select or Download Code
Re: Weird File::Basename::basename (yes, but)
by Anonymous Monk on Mar 26, 2013 at 15:26 UTC

    Is this a bug?

    Yes , I think so.

    See http://perl5.git.perl.org/perl.git/blob/HEAD:/lib/File/Basename.t, its a typical bug (if a boundary condition isn't tested, chances are it'll be broken)

    OTOH, on the scale of importance/severity, I would classify this bug as unimportant

    FWIW, you should perlbug it just the same :) functions should do what they claim to do -- and they might as well explicitly spell out what that is instead of merely referring to the manpages -- I'll bet if the pod actually spelled out the full behaviour, there would have been a test for it in the test suite :)

      On the importance of this bug: In a way "./" is the neutral element in pathes in the sense of adding it anywhere in the path does not change anything (except in the middle of a name obviously).

      One exception springs to mind: When executing a command it does make a difference whether to say

      system("somecommand"); # or system("./somecommand");

      Whether or not this can happen due to the usage of basename('') in any practical example I am not sure.

        When executing a command it does make a difference whether to say "foo" or "./foo"

        not on cmd.exe, cwd is first place searched

        :) spec/basename are useful, but they're kinda low-level, I prefer abstractions like Path::Class and Badger::Filesystem and absolute paths, so file( ... )->absolute

Re: Weird File::Basename::basename
by RichardK (Vicar) on Mar 26, 2013 at 16:11 UTC

    I prefer to use File::Spec splitpath, as it seems more logical and does the right thing -- even if volume doesn't make any sense on a proper system ;)

Re: Weird File::Basename::basename
by McA (Priest) on Mar 27, 2013 at 04:29 UTC

    Hi,

    UPDATE: I made a little test program in C to see the behaviour there. Interestingly the basename('') is '.'. So it seems we have now three different results:

    • Shell: basename '' => ''
    • File::Basename: basename '' => './'
    • C basename: basename '' => '.'

    McA

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1025525]
Approved by kcott
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (5)
As of 2015-07-04 09:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (59 votes), past polls