> I don't think this is a bug. I think your second instance is a correct > instance of the behavior set forth in the File::Spec documentation. > > "File::Spec::Unix::catfile: > > Concatenate one or more directory names and a filename to form a > complete path ending with a filename" > > The documentation -- and this is true of File::Spec itself, as well -- > specifies that catfile() ought to take a non-zero list of directories > and a filename. Your second instance above does this. I hadn't even realized that the documentation required at least one directory entry, given the case of "no directory" is handled explicitly both in catfile()'s implementation and tests. However, I'm pretty sure many people write catfile(@dirs, $file) without checking that @dirs is not empty. So, practically speaking, catfile() has to handle that case. I can see several solutions : - 1°) catfile() should always return canonical paths stripped from their leading ./ when they are relative. It means that catfile() would actually be reimplemented as canonpath(join '/', @_). This is consistent, but sometimes you need to prepend curdir() to a path in a portable way, like when you want pass an executable to system() (as in my original report). - 2°) catfile() should always return canonical paths starting with ./ when they are relative. Theoretically, this is the best solution but I suspect it would break a lot of tests on CPAN that compare what catfile() returns against an hard-coded path. - 3°) catfile() should just concatenate its arguments, without canonifying leadings "./". This is consistent (as far as catfile() is concerned), has limited breakage potential, and still allow to prepend a dot when needed, so it is my preferred way of fixing the issue. To summarize, here's what catfile() returns for each of these strategies (0 being the current state of affairs) : +-----+-----+-----+-----+ | 0 | 1 | 2 | 3 | +-------------------+-----+-----+-----+-----+ | catfile('a') | a | a | ./a | a | +-------------------+-----+-----+-----+-----+ | catfile('./a') | a | a | ./a | ./a | +-------------------+-----+-----+-----+-----+ | catfile('.', 'a') | ./a | a | ./a | ./a | +-------------------+-----+-----+-----+-----+ I have implemented solution 3°) in the topic branch vincent/normalize_unix_catfile in the repository, and I will smoke it against the CPAN when the machine is available. VincentThread Previous | Thread Next