use File::chdir;
$CWD = "/foo/bar"; # now in /foo/bar
{
local $CWD = "/moo/baz"; # now in /moo/baz
...
}
# still in /foo/bar!
This sucks.
File::chdir gives you an alternative, $CWD and @CWD. These two variables combine all the power of "chdir()", File::Spec and Cwd.
use File::chdir;
$CWD = $dir; # just like chdir($dir)!
print $CWD; # prints the current working directory
It can be localized, and it does the right thing.
$CWD = "/foo"; # it's /foo out here.
{
local $CWD = "/bar"; # /bar in here
}
# still /foo out here!
$CWD always returns the absolute path in the native form for the operating system.
$CWD and normal "chdir()" work together just fine.
# Similar to chdir("/usr/local/src/perl")
@CWD = qw(usr local src perl);
pop, push, shift, unshift and splice all work. pop and push are probably the most useful.
pop @CWD; # same as chdir(File::Spec->updir)
push @CWD, 'some_dir' # same as chdir('some_dir')
@CWD and $CWD both work fine together.
*NOTE* Due to a perl bug you can't localize @CWD. See ``CAVEATS'' for a work around.
Here's $CWD instead of "chdir()":
$CWD = 'foo'; # chdir('foo')
and now instead of Cwd.
print $CWD; # use Cwd; print Cwd::abs_path
you can even do zsh style "cd foo bar"
$CWD = '/usr/local/foo';
$CWD =~ s/usr/var/;
if you want to localize that, make sure you get the parens right
{
(local $CWD) =~ s/usr/var/;
...
}
It's most useful for writing polite subroutines which don't leave the program in some strange directory:
sub foo {
local $CWD = 'some/other/dir';
...do your work...
}
which is much simpler than the equivalent:
sub foo {
use Cwd;
my $orig_dir = Cwd::getcwd;
chdir('some/other/dir');
...do your work...
chdir($orig_dir);
}
@CWD comes in handy when you want to start moving up and down the directory hierarchy in a cross-platform manner without having to use File::Spec.
pop @CWD; # chdir(File::Spec->updir);
push @CWD, 'some', 'dir' # chdir(File::Spec->catdir(qw(some dir)));
You can easily change your parent directory:
# chdir from /some/dir/bar/moo to /some/dir/foo/moo
$CWD[-2] = 'foo';
{
local $CWD;
pop @CWD;
...
}
@CWD = qw/a b c d/;
Internally, Perl clears @CWD and assigns each element in turn. Thus, this code above will do this:
chdir 'a';
chdir 'a/b';
chdir 'a/b/c';
chdir 'a/b/c/d';
Generally, avoid assigning to @CWD and just use push and pop instead.
my $working_dir = File::Spec->catdir( $CWD, "foo" );
$CWD = $working_dir;
doing_stuff_might_chdir();
is( $CWD, $working_dir, "back to original working_dir?" );
Deleting the last item of @CWD will act like a pop. Deleting from the middle will throw an exception.
delete @CWD[-1]; # OK
delete @CWD[-2]; # Dies
What should %CWD do? Something with volumes?
# chdir to C:\Program Files\Sierra\Half Life ?
$CWD{C} = '\\Program Files\\Sierra\\Half Life';
* ~Can't delete except at the end of @CWD~ * ~Failed to change directory to '$dir'~
Abigail and/or Bryan Warnock suggested the $CWD thing (Michael forgets which). They were right.
The "chdir()" override was eliminated in 0.04.
David became co-maintainer with 0.06_01 to fix some chronic Win32 path bugs.
As of 0.08, if changing $CWD or @CWD fails to change the directory, an error will be thrown.
<https://github.com/dagolden/File-chdir>
git clone https://github.com/dagolden/File-chdir.git
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.