在perl中构建工作目录的内容数组

时间:2016-04-01 14:12:36

标签: perl directory-structure working-directory

我正在开发一个脚本,该脚本使用诸如

之类的路径来利用周围目录中的文件
"./dir/file.txt"

只要工作目录是包含脚本的工作目录,这样就可以了。但是,该脚本将发送给多个用户,有些人可能无法更改其工作目录并通过键入其整个路径来运行脚本:

./path/to/script/my_script.pl

这会产生一个问题,因为当脚本尝试访问./dir/file.txt时,它正在主目录中查找/ dir目录,当然,它不能解决它。

我正在尝试使用readdir和chdir来修正目录,如果它不是正确的目录,这是我到目前为止所拥有的:

my $working_directory = $ENV{PWD};
print "Working directory: $working_directory\n";       #accurately prints working directory
my @directory = readdir $working_directory;            #crashes script

if (!("my_script.pl" ~~ @directory)){                  #if my_script.pl isnt in @directoryies, do this
    print "Adjusting directory so I work\n";
    print "Your old directory: $ENV{PWD}\n";
    chdir $ENV{HOME};                                  #make the directory home
    chdir "./path/to/script/my_script.pl";             #make the directory correct
    print "Your new directory: $ENV{PWD}\n";
}

包含readdir的行使我的脚本崩溃并出现以下错误

  

dirhandle的错误符号位于./path/to/script/my_script.pl第250行。

我发现这很奇怪,因为我从主目录运行它,它预先正确地打印出来并且与"坏符号无关#34;

我对任何解决方案持开放态度

提前谢谢

2 个答案:

答案 0 :(得分:1)

readdir使用目录句柄操作,而不是字符串上的路径。您需要执行以下操作:

opendir(my $dh, $working_directory) || die "can't opendir: $!";
my @directory = readdir($dh);

检查readdiropendir的perldoc。

答案 1 :(得分:1)

我认为你以错误的方式解决这个问题。如果您正在寻找使用您的脚本旅行的文件,那么您可能应该考虑的是FindBin模块 - 它可以让您找出脚本的路径,以便在路径中使用链接。

所以,例如。

use FindBin;
my $script_path = $FindBin::Bin; 

open ( my $input, '<', "$script_path/dir/file.txt" ) or warn $!;

这样你就不必对chdirreaddir等感到兴奋。