获取活动perl文件的目录

时间:2013-10-31 20:27:48

标签: perl directory

我使用perl并将文件保存在目录中,如下所示:

/root/dir_1/dir_2/dir_3/dir_4/perl_file.pl

我在perl文件中尝试做的是获取/root ... dir_4/dir_4/的字符串,以便我可以使用它来创建另一个目录(我可以使用特定的模式)用来制作新目录。)

我一直在查看File :: Copy和File :: Basename,它们似乎要求您指定路径,但我希望我的路径可以根据运行的文件进行变量。它似乎很简单,可能是我只是忽略了,但这可能吗?

在伪代码中,我正在寻找像my $dir = UpOneDirectory(thisperlfile) or FilePath(thisperlfile)

这样的东西

3 个答案:

答案 0 :(得分:5)

use FindBin qw( $RealBin );
say $RealBin;

答案 1 :(得分:1)

use File::Basename;
use Cwd qw( abs_path );

my $dir = dirname(abs_path($0));

答案 2 :(得分:0)

...或者...如果您不想依赖外部模块,可以使用单行正则表达式替换:

(my $me = $0) =~ s#(^/.*?)/?[^/]*$#\1#;

这将为$me分配一个字符串值,表示包含当前脚本的目录的路径。

以下是它的工作原理。 $ 0包含当前正在执行的脚本的路径。我们想将它分配给$me,但是我们也希望用正则表达式替换来操作它,所以我们将赋值放在括号内(注意," my"声明也必须在parens里面(或perl将barf))。

正则表达式匹配最初的' /'其次是所有角色,直到最后的' /'然后所有非' /'字符串末尾的字符(注意:正则表达式使用' ^'和' $')固定在两端。然后使用分组集替换最终的(但不包括)最终的' /'作为新的字符串值。 IOW:路径的目录组件。

另请注意,所有这些额外的漏洞只是为了处理文件位于根目录中的情况,我们希望结果实际上是' /' (而不是'')。如果我们不需要覆盖这种情况,那么正则表达式可能会更简单,如下所示:

(my $me = $0) =~ s#/[^/]*$##; # DON'T USE THIS ONE  (Use the above example instead)

......但这并不涵盖所有基础。