The Cwd module provides several functions for finding the current directory. The most similar-seeming are
getcwd. Have you ever wondered why you should pick one or the other?
I always use
getcwd and I’ll show you why.
~/.dzil directory is a symlink to a git repository elsewhere. If I’m in that directory in my terminal, here is a look at three ways to get the current path:
$ perl -MCwd=cwd,getcwd -MFile::Spec -wE 'say for cwd(), getcwd(), File::Spec->rel2abs(".")' /Users/david/.dzil /Users/david/git/dotfiles/dzil /Users/david/git/dotfiles/dzil
cwd call returns the symlink path — the way the shell sees it. The
getcwd call returns the real path with the symlink resolved.
Now look at the third. That’s from File::Spec. A LOT of code uses File::Spec to manipulate paths. If you ever want to compare the current directory against a path made absolute by File::Spec, you need to use
I’ve found that
getcwd is more consistent across platforms, whereas
cwd can be implemented differently depending on your platform or if you have XS or pure-perl implementations.
I like consistency.
Sure, there are cases where the “shell view” of the current directory is more important and you might want to use
cwd, but I find that is the exception, not the rule.
Consistency matters. Use