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.