Michael G Schwern <[EMAIL PROTECTED]> writes:
>  dirname("/perl/")      == "/perl"
>  dirname("/perl/lib//") == "/perl/lib"
>
>That's what I'd think, anyway.  But the tests specificly contradict this
>saying 
>
>  dirname("/perl/lib//") == "/perl"
>
>and specificly pointing out that 5.003_18 returned /perl/lib which was 
>"wrong".
>
>According to the documentation the current behavior is both correct and
>incorrect.  The docs say dirname() "returns the directory portion of the
>input file specification".  So in that sense its wrong.  But it also says
>dirname() "conforms to the behavior of the Unix shell command dirname(1)"  
>Here's how the BSD manpage describes how it works:
>
>     The dirname utility deletes the filename portion, beginning with the last
>     slash `/' character to the end of string (after first stripping trailing
>     slashes), and writes the result to the standard output.
>
>Note they refrain from saying that it actually returns the directory name! 
>It smells like a euphemism for "this function is weak and broken but we 
>retain the broken functionality for backwards compatibility purposes".
>
>So does File::Basename follow the shell over this cliff or does dirname()
>actually return the directory name?  Do we slavishly remain compatible with
>dirname(1) or correct its mistakes?  

We slavishly remain compatbile with our code base - which expects
dirname to behave like dirname(1).

dirname "means" strip one level off input.

If you want a clean abstraction File::Spec is over there ->

>
>As I can probably count on one hand the number of people who are using 
>dirname() to mimic the exact behavior of dirname(1),

Well there are at least 7 of them at my day-job place-of-work.

Typical use is 

$path = dirname(dirname($foo));


>as opposed to simply 
>expecting it to return the directory, I think we can safely fix this.  I
>can also probably count on one hand the number of people who are aware of
>these caveats about dirname(1).
>
>This also closes some discrepencies between dirname() and fileparse().



>Currently...
>
>       (fileparse("/bar/"))[1] == "/bar/"
>       dirname("/bar/")        == "/"
>
>       (fileparse("bar/"))[1] == "bar/"
>       dirname("bar/")        == "."
>
>They should be equivalent.

Reply via email to