package File::Spec::Unix; use Exporter (); use Config; use File::Basename qw(basename dirname fileparse); use DirHandle; use strict; use vars qw(@ISA $Is_Mac $Is_OS2 $Is_VMS $Is_Win32); use File::Spec; Exporter::import('File::Spec', '$Verbose'); $Is_OS2 = $^O eq 'os2'; $Is_Mac = $^O eq 'MacOS'; $Is_Win32 = $^O eq 'MSWin32'; if ($Is_VMS = $^O eq 'VMS') { require VMS::Filespec; import VMS::Filespec qw( &vmsify ); } =head1 NAME File::Spec::Unix - methods used by File::Spec =head1 SYNOPSIS C =head1 DESCRIPTION Methods for manipulating file specifications. =head1 METHODS =over 2 =item canonpath No physical check on the filesystem, but a logical cleanup of a path. On UNIX eliminated successive slashes and successive "/.". =cut sub canonpath { my($self,$path) = @_; $path =~ s|/+|/|g ; # xx////xx -> xx/xx $path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx $path =~ s|^(\./)+|| unless $path eq "./"; # ./xx -> xx $path =~ s|/$|| unless $path eq "/"; # xx/ -> xx $path; } =item catdir Concatenate two or more directory names to form a complete path ending with a directory. But remove the trailing slash from the resulting string, because it doesn't look good, isn't necessary and confuses OS2. Of course, if this is the root directory, don't cut off the trailing slash :-) =cut # '; sub catdir { shift; my @args = @_; for (@args) { # append a slash to each argument unless it has one there $_ .= "/" if $_ eq '' or substr($_,-1) ne "/"; } my $result = join('', @args); # remove a trailing slash unless we are root substr($result,-1) = "" if length($result) > 1 && substr($result,-1) eq "/"; $result; } =item catfile Concatenate one or more directory names and a filename to form a complete path ending with a filename =cut sub catfile { my $self = shift @_; my $file = pop @_; return $file unless @_; my $dir = $self->catdir(@_); for ($dir) { $_ .= "/" unless substr($_,length($_)-1,1) eq "/"; } return $dir.$file; } =item curdir Returns a string representing of the current directory. "." on UNIX. =cut sub curdir { return "." ; } =item rootdir Returns a string representing of the root directory. "/" on UNIX. =cut sub rootdir { return "/"; } =item updir Returns a string representing of the parent directory. ".." on UNIX. =cut sub updir { return ".."; } =item no_upwards Given a list of file names, strip out those that refer to a parent directory. (Does not strip symlinks, only '.', '..', and equivalents.) =cut sub no_upwards { my($self) = shift; return grep(!/^\.{1,2}$/, @_); } =item file_name_is_absolute Takes as argument a path and returns true, if it is an absolute path. =cut sub file_name_is_absolute { my($self,$file) = @_; $file =~ m:^/: ; } =item path Takes no argument, returns the environment variable PATH as an array. =cut sub path { my($self) = @_; my $path_sep = ":"; my $path = $ENV{PATH}; my @path = split $path_sep, $path; foreach(@path) { $_ = '.' if $_ eq '' } @path; } =item join join is the same as catfile. =cut sub join { my($self) = shift @_; $self->catfile(@_); } =item nativename TBW. =cut sub nativename { my($self,$name) = shift @_; $name; } =back =head1 SEE ALSO L =cut 1; __END__