我正在尝试实现一个perl脚本,我需要获取一个我执行文件的目录。
例如,如果我正在执行的文件位于C:\Scripts\MyScript.pl
,我希望获得C:\Scripts
。
我试过了dirname
,但它似乎没有做我想要的。它只打印.
我知道我需要同时使用dirname
和abs_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
答案 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__ ));