我的许多同事在他们的BEGIN块中使用以下命令。
$scriptDir = dirname($0);
chdir($scriptDir);
$scriptDir = getcwd();
我环顾四周,无法帮助,但认为第三行即$scriptDir = getcwd();
是多余的。因为我们已经有来自$scriptDir = dirname($0);
的scriptdir。我在这里遗漏了什么?
答案 0 :(得分:7)
dirname($0)
并未返回完整路径,Chankey Pathak和Matthias
演示。
我想补充说还有其他方法。例如,您可以使用FindBin(也是核心)
use FindBin qw($RealBin);
BEGIN: {
my ($scriptDir) = $RealBin;
chdir $scriptDir or die "Can't change to $scriptDir: $!";
};
$RealBin
与您展示的内容相同,只是它是已解决链接的完整路径。
由于chdir的评论,ikegami可能会失败。在这种情况下,返回false并且上面的代码消失,根据需要进行调整。请注意,质疑的第三行与此无关。
此模块也常用于具有lib编译指示的库的相对路径,例如
use lib "$RealBin/../lib";
可能会更容易决定将它用于两者。
更多的是,考虑File::Basename的dirname
描述(强调不是我的)
提供此函数是为了与Unix shell命令
dirname(1)
兼容,并继承了它的一些怪癖。尽管它的名称是 NOT 总是返回您可能期望的目录名称。为安全起见,如果您希望路径的目录名称使用fileparse()
。
我宁愿和
一起去use Cwd qw(abs_path);
BEGIN: {
my ($scriptDir) = abs_path(__FILE__) =~ m|(.*)/|;
chdir $scriptDir
or die "Can't change to $scriptDir: $!";
};
使用abs_path
,因为__FILE__
本身可能无法提供完整路径。正则表达式贪婪地将所有内容挖到最后/
,即脚本目录的完整路径。
答案 1 :(得分:4)
下面的例子很好地解释了它。
#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;
use Cwd;
my $scriptDir = dirname($0);
chdir($scriptDir);
print "First: $scriptDir\n";
$scriptDir = getcwd();
print "Second: $scriptDir\n";
输出:
chankeypathak@stackoverflow:~/Desktop$ perl test.pl
First: .
Second: /home/chankeypathak/Desktop
答案 2 :(得分:0)
我不是下一个perl monger,但我尝试用一个小脚本执行你给出的代码:
#!/usr/bin/perl
#
use strict;
use File::Basename;
use Cwd;
BEGIN {
my $scriptDir = dirname($0);
print "scriptDir = $scriptDir\r\n";
chdir($scriptDir);
$scriptDir = getcwd();
print "scriptDir = $scriptDir\r\n";
}
这就是出来的结果:
map@host:~/perltest> ./script.pl
scriptDir = .
scriptDir = /home/map/perltest
map@host:~/perltest>
看起来dirname和getcwd在这种情况下有所不同。但是,如果在路径中找到了scrip.pl,则没有区别:
map@host:~> cp script.pl ~/bin
map@host:~> cd
map@host:~> script.pl
scriptDir = /home/map/bin
scriptDir = /home/map/bin
map@host:~> rm ~/bin