我正在开发一个脚本,该脚本使用诸如
之类的路径来利用周围目录中的文件"./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;
我对任何解决方案持开放态度
提前谢谢
答案 0 :(得分:1)
readdir
使用目录句柄操作,而不是字符串上的路径。您需要执行以下操作:
opendir(my $dh, $working_directory) || die "can't opendir: $!";
my @directory = readdir($dh);
答案 1 :(得分:1)
我认为你以错误的方式解决这个问题。如果您正在寻找使用您的脚本旅行的文件,那么您可能应该考虑的是FindBin
模块 - 它可以让您找出脚本的路径,以便在路径中使用链接。
所以,例如。
use FindBin;
my $script_path = $FindBin::Bin;
open ( my $input, '<', "$script_path/dir/file.txt" ) or warn $!;
这样你就不必对chdir
和readdir
等感到兴奋。