tar*_*nkt 7 perl dirname getcwd
我的许多同事在他们的BEGIN块中使用以下命令.
$scriptDir = dirname($0);
chdir($scriptDir);
$scriptDir = getcwd();
Run Code Online (Sandbox Code Playgroud)
我环顾四周,不禁认为第三条线$scriptDir = getcwd();是多余的.因为我们已经有了$scriptDir = dirname($0);.Am的scriptdir,我在这里遗漏了什么?
dirname($0)正如Chankey Pathak和Matthias所
证明的那样,并没有回归完整的道路.
我想补充说还有其他方法.例如,您可以使用FindBin(也是核心)
use FindBin qw($RealBin);
BEGIN: {
my ($scriptDir) = $RealBin;
chdir $scriptDir or die "Can't change to $scriptDir: $!";
};
Run Code Online (Sandbox Code Playgroud)
在$RealBin给出了一样的,你显示什么,除了它是解决环节的完整路径.
该CHDIR可能会失败,这要归功于池上的评论.在这种情况下,返回false并且上面的代码消失,根据需要进行调整.请注意,质疑的第三行与此无关.
例如,该模块通常也用于具有lib pragma的库的相对路径
use lib "$RealBin/../lib";
Run Code Online (Sandbox Code Playgroud)
什么可能使得更容易决定将它用于两者.
更多,给出File :: Basename中的dirname描述(强调不是我的)
提供此函数是为了与Unix shell命令兼容,
dirname(1)并继承了它的一些怪癖.尽管它的名字它不总是返回正如你所预料的目录名.为了安全起见,如果要使用路径的目录名称fileparse().
我宁愿一起去
use Cwd qw(abs_path);
BEGIN: {
my ($scriptDir) = abs_path(__FILE__) =~ m|(.*)/|;
chdir $scriptDir
or die "Can't change to $scriptDir: $!";
};
Run Code Online (Sandbox Code Playgroud)
其中,abs_path由于使用__FILE__自身可能无法提供完整路径.正则表达式贪婪地将所有内容挖到最后/,即脚本目录的完整路径.