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.