Как сказал Хьюго, вы не можете воздействовать на cwd вашего родительского процесса, поэтому проблем нет.
Где вопрос более применим, если вы не контролируете весь процесс, как в подпрограмме или модуле. В этих случаях вы хотите выйти из подпрограммы в том же каталоге, в котором вы ввели, в противном случае незаметное действие происходит на расстоянии, что приводит к ошибкам.
Вы можете сделать это вручную ...
use Cwd;
sub foo {
my $orig_cwd = cwd;
chdir "some/dir";
...do some work...
chdir $orig_cwd;
}
но с этим есть проблемы. Если подпрограмма возвращается рано или умирает (и исключение перехватывается), ваш код все равно будет в some/dir
. Кроме того, chdir
могут не работать, и вы должны помнить, чтобы проверить каждое использование. BLEH.
К счастью, есть пара модулей, чтобы сделать это проще. File :: pushd один, но я предпочитаю File :: chdir .
use File::chdir;
sub foo {
local $CWD = 'some/dir';
...do some work...
}
File :: chdir переводит каталоги в $CWD
. И вы можете локализовать $CWD
, чтобы он сбрасывался в конце вашей области, несмотря ни на что. Он также автоматически проверяет, успешно ли chdir
, и выдает исключение в противном случае. Иногда это используется в скриптах, потому что это так удобно.