This module is obsolete since IO::Spec is implemented in rakudo.
use File::Spec; say File::Spec.curdir; #your current OS's curdir say File::Spec.os('Win32').rootdir # "\" on any OS
Methods (current state):
Unix Mac Win32 VMS Cygwin canonpath done done done done no-parent-or-current-test done done done devnull done done done done done curdir done done done done done updir done done done done done rootdir done done done tmpdir done done done done done path done done done done file-name-is-absolute done done done done done split done done ~~ done join done done ~~ done splitpath done done done ~~ done catpath done done ~~ done splitdir done done done catdir done done done catfile done done done abs2rel done done done rel2abs done done done
'~~' means partially implemented, but not passing tests.
See Perl 5 File::Spec for now. The methods are the same, but use dots instead of arrows.
no_updirs is gone, because its use case is handled automatically by
dir(). For the test that supplies dir with its functionality, see new method
case_tolerant has moved to its own module, File::Spec::Case, and slightly changed its interface.
join is no longer an alias for
catfile, but instead a unique function similar to
catpath. See the description of join in the New methods section.
The os method takes a single argument, an operating system string, and returns a File::Spec object for the appropriate OS.
my $mac_os_x_spec = File::Spec.os('darwin'); # returns a File::Spec::Unix object my $windows_spec = File::Spec.os('MSWin32'); #returns File::Spec::Win32 say File::Spec.os('Win32').canonpath('C:\\foo\\.\\bar\\'); # prints "C:\foo\bar"
The parameter can be either an operating system string, or the last part of the name of a subclass ('Win32', 'Mac'). The default is
$*OS, which gives you the same subclass that File::Spec already uses for your system.
A close relative of
splitdir, this function also splits a path into volume, directory, and basename portions. Unlike splitdir, path-components returns paths compatible with dirname and basename.
This means that trailing slashes will be eliminated from the directory and basename components, in Win32 and Unix-like environments. The basename component will always contain the last part of the path, even if it is a directory,
'..'. If a relative path's directory portion would otherwise be empty, the directory is set to
On systems with no concept of volume, returns
'' (the empty string) for volume.
($volume, $directories, $basename) = File::Spec.split( $path );
The results can be passed to
.join to get back a path equivalent to (but not necessarily identical to) the original path. If you want to keep all of the characters involved, use
Comparison of splitpath and split
OS Path splitpath split linux /a/b/c ("", "/a/b/", "c") ("", "/a/b", "c") linux /a/b//c/ ("", "/a/b//c/", "") ("", "/a/b", "c") linux /a/b/. ("", "/a/b/.", "") ("", "/a/b", ".") Win32 C:\a\b\ ("C:", "\\a\\b\\", "") ("C:", "\\a", "b") VMS A:[b.c] ("A:", "[b.c]", "") ("A:", "[b]", "[c]")
A close relative of
.catpath, this function takes volume, directory and basename portions and returns an entire path. If the dirname is
'.', it is removed from the (relative) path output, because this function inverts the functionality of dirname and basename.
$full-path = File::Spec.join($volume, $dirname, $basename);
Directory separators are inserted if necessary. Under Unix, $volume is ignored, and only directory and basename are concatenated. On other OSes, $volume is significant.
This method is the inverse of
.split; the results can be passed to it to get the volume, dirname, and basename portions back.
Comparison of catpath and join
OS Components catpath join linux ("", "/a/b", "c") /a/b/c /a/b/c linux ("", ".", "foo") ./foo foo linux ("", "/", "/") // / Win32 ("C:", "\a", "b") C:\a\b C:\a\b VMS ("A:", "[b]", "[c]") A:[b][c] A:[b.c]
Returns a test as to whether a given path is identical to the parent or the current directory. The
dir() function automatically removes these for you in directory listings, so under normal circumstances you shouldn't need to use it directly.
'file' ~~ File::Spec.no-parent-or-current-test #False '.' ~~ File::Spec.no-parent-or-current-test #True '..' ~~ File::Spec.no-parent-or-current-test #True
This can, however, be used to extend
dir() through its
dir( "my/directory", test=> all(File::Spec.no-parent-or-current-test, /^ '.' /));
This example would return all files begining with a period that are not
This replaces the functionality of the old