更改为目录然后getcwd()

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,我在这里遗漏了什么?

zdi*_*dim 7

dirname($0)正如Chankey PathakMatthias所 证明的那样,并没有回归完整的道路.

我想补充说还有其他方法.例如,您可以使用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__自身可能无法提供完整路径.正则表达式贪婪地将所有内容挖到最后/,即脚本目录的完整路径.