2013-10-31 81 views
0

我用Perl工作,有一个文件保存在目录中,像这样:获取目录

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

我试图从perl的文件本身做的是得到/root ... dir_4/字符串或只需dir_4/,然后我可以使用它来创建另一个目录(我可以使用特定的模式来创建新目录)。

我一直在寻找的文件::复制和文件::基名,这似乎需要你指定的路径,但我想根据所运行的文件我的路径是可变的。这似乎很简单,可能是我只是俯视,但这可能吗?

在伪代码,我在寻找类似my $dir = UpOneDirectory(thisperlfile) or FilePath(thisperlfile)

回答

5
use FindBin qw($RealBin); 
say $RealBin; 
+0

我讨厌FinBin _works_。我不喜欢导出的变量。如果它使用函数,我会。 –

+2

@David W.默认情况下不会导出。您可以随时使用'$ FindBin :: RealBin'。你也可以提交一个补丁,添加'sub RealBin {$ RealBin}' – ikegami

+0

这实际上就是我所做的。我不输出变量。 –

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

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

摆脱中间人:'我的$ dir = dirname(abs_path($ 0));' – toolic

+0

@toolic谢谢您的评论。更新了ans。有时我会使用稀疏语句来提高代码的可读性。 – jkshah

0

...或...如果你不想依赖外部模块,你可以这样做用一个行正则表达式替换:

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

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

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

正则表达式匹配最初的'/',后面跟着所有字符到最后的'/',然后是所有非'/'字符到字符串末尾(注意:正则表达式使用'^' '和'$')。然后使用分组集来替换最后的(/不包括)最终的'/'作为新的字符串值。 IOW:路径的目录组件。

另外请注意,所有这些额外的绒毛只是为了处理文件驻留在根目录中的情况,我们希望结果实际上是'/'(而不是'')。如果我们没有需要覆盖这种情况下,正则表达式可能是更简单的,就像这样:

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

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