Cwd::Guard can change the current directory (chdir) using a limited scope.
use Cwd::Guard qw/cwd_guard/;
use Cwd;
my $dir = getcwd;
MYBLOCK: {
my $guard = cwd_guard('/tmp/xxxxx') or die
"failed chdir: $Cwd::Guard::Error";
... # chdir to /tmp/xxxxx
}
... # back to $dir