Perl`dirname`打印点而不是完整路径

时间:2017-09-29 20:21:56

标签: perl

我正在尝试实现一个perl脚本,我需要获取一个我执行文件的目录。

例如,如果我正在执行的文件位于C:\Scripts\MyScript.pl,我希望获得C:\Scripts

我试过了dirname,但它似乎没有做我想要的。它只打印.

我知道我需要同时使用dirnameabs_path,但是abs_path似乎有些错误,因为它会返回一些UNIX查找目录,然后将其与实际路径连接起来最后是无效的路径。

这是我的概念证明。

# The initial variable with file
say $0; # C:\Users\sed\AppData\Roaming\npm\node_modules\my-test-module\my-test-file

# This is just a current directory
say dirname($0); # .

# This looks like a bug to me, the shell is opened in C:/Users/sed so it is related
say abs_path($0); # /c/Users/sed/C:/Users/sed/AppData/Roaming/npm/node_modules/my-test-module\my-test-file

# This is what I need, except I don't need that first UNIX looking part
say dirname(abs_path($0)); # /c/Users/sed/C:/Users/sed/AppData/Roaming/npm/node_modules/my-test-module

3 个答案:

答案 0 :(得分:1)

快速浏览一下:

perldoc File::Basename

说明为什么它可能不是您需要做的最佳选择。 请尝试使用File :: Spec。

C:\Users\Ken> echo C:\Scripts\MyScript.pl | perl -MFile::Spec -lne "print $_; ($v,$d,$f)=File::Spec->splitpath($_); print $v.$d;"
C:\Scripts\MyScript.pl
C:\Scripts\

类型:

perldoc File::Spec

了解更多信息。顺便说一下,我用Strawberry perl v5.24.1进行了测试

答案 1 :(得分:0)

use FindBin qw( $RealBin );

say $RealBin;

常用:

use lib $RealBin;

use lib "$RealBin/lib";

答案 2 :(得分:0)

使用Strawberry Perl v5.26.1,我发现直接启动脚本(如MyScript.pl)与使用Perl启动脚本(即perl MyScript.pl)产生了不同的结果。在后一种情况下,我得到了无用的相对(点)输出。

以下两种情况对我都有效:

use File::Basename;
use File::Spec;
my (undef, $this_script_folder, undef) = fileparse(File::Spec->rel2abs( __FILE__ ));