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

Build array of the contents of the working directory in perl

我正在编写一个脚本,该脚本使用

等路径利用周围目录中的文件
"./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 的行使我的脚本崩溃并出现以下错误

Bad symbol for dirhandle at ./path/to/script/my_script.pl line 250.

我觉得很奇怪,因为我是从主目录中 运行 宁此的,它事先正确打印出来并且与 "bad symbol"

无关

我愿意接受任何解决方案

提前致谢

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

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

检查两者的 perldoc readdir and opendir

我认为你的做法是错误的。如果您正在寻找与您的脚本一起移动的文件,那么您可能应该考虑的是 FindBin 模块 - 它可以让您找出脚本的路径,用于路径链接。

例如

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

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

这样你就不用再为 chdirreaddir 等操心了。