Trying to get Path::Class to pass it's tests on VMS Perl 5.8.7 on ODS-2 disk.
One of the test cases is calling: File::Spec->splitpath('t',1); So on Unix: perl -e "use File::Spec;print join('|',File::Spec->splitpath('t',0))" ||t perl -e "use File::Spec;print join('|',File::Spec->splitpath('t',1))" |t| On VMS: perl -e "use File::Spec;print join('|',File::Spec->splitpath('t',0))" ||t perl -e "use File::Spec;print join('|',File::Spec->splitpath('t',1))" ||t It's this last command that is the problem, the expected behaviour in Path::Class is |t|. The doc for File::Spec->splitpath states: splitpath Splits a path in to volume, directory, and filename portions. On systems with no concept of volume, returns '' for volume. ($volume,$directories,$file) = File::Spec->splitpath( $path ); ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file ); For systems with no syntax differentiating filenames from directories, assumes that the last file is a path unless $no_file is true or a trailing separator or /. or /.. is present. On Unix, this means that $no_file true makes this return ( '', $path, '' ). The directory portion may or may not be returned with a trailing '/'. The results can be passed to "catpath()" to get back a path equivalent to (usually identical to) the original path. So I'm wondering if File::Spec::VMS->splitpath should support $no_file or not? It looks like the majority of File::Spec::* modules do, I don't know if they all have syntax that does not differentiate filenames from directories. Current File::Spec::VMS splitpath is: sub splitpath { my($self,$path) = @_; my($dev,$dir,$file) = ('','',''); vmsify($path) =~ /(.+:)?([\[<].*[\]>])?(.*)/s; return ($1 || '',$2 || '',$3); } This hack changes the behaviour so that File::Spec::VMS->splitpath('t', 1) returns t as the dir and not the file. All PathTools 3.27 tests still pass. sub splitpath { my($self,$path, $nofile) = @_; my($dev,$dir,$file) = ('','',''); if ( $nofile ){ vmsify($path) =~ /(.+:)?(.*)/s; return ($1 || '',$2 || '',$file); } else { vmsify($path) =~ /(.+:)?([\[<].*[\]>])?(.*)/s; return ($1 || '',$2 || '',$3); } } Just wondering if anyone has any thoughts on this? Thanks, Peter (Stig) Edwards