Symlink Perl中的两个Dirs

时间:2019-06-17 03:43:56

标签: perl

我在下面的代码中有两个链接的符号链接。

 onSearch = async value => {
      console.log(value);
      if (value) {
        const searchData = await axios.get("/api/search_member", { value });
        console.log(searchData);
      }
    };

当我在本地运行它时,效果很好。但是当我将其组合到另一个脚本中时,这会给出一个错误。

my $Directory = "/data/backups/";
my $symLinkDirectory = "newdisk/data/backups/";

opendir ( DIR, $Directory ) || die "Error in opening directory $Directory\n";
while( ( $fileName = readdir(DIR))){
    my $filePath = "$Directory"."$fileName";
    symlink("$filePath","$symLinkDirectory"."$fileName");
}

closedir(DIR);

知道为什么会这样吗?为什么在本地工作而不是结合在一起工作?

1 个答案:

答案 0 :(得分:2)

您的代码中未声明$fileName。在没有strict模式的情况下,它隐式地成为全局变量。

但是,您的其他脚本可能会执行use strict;(应该这样做),因此未声明的变量是错误的。解决方法是(如错误消息所建议的那样)使用my将其设置为局部变量:

while( ( my $fileName = readdir(DIR))){

顺便说一句,DIR在您的代码中也是有效的全局变量。没有理由:

opendir(my $dh, $Directory) or die "$0: error in opening directory $Directory: $!\n";
while (my $fileName = readdir($dh)) {

您可以使用普通变量代替裸字句柄。另外,错误消息应包含$0(脚本名称)和$!(错误原因)。

此外,您可能不应该尝试将...进行符号链接:

    next if $fileName eq '.' || $fileName eq '..';

对于my $filePath = "$Directory"."$fileName",您应该使用普通串联或字符串插值:

    my $filePath = $Directory . $fileName;
    # -or-
    my $filePath = "$Directory$fileName";

无需单独引用"$variables"。这不是shell脚本。

symlink可能会失败。您的代码可能应该检查一下:

    symlink($filePath, $symLinkDirectory . $fileName) or warn "$0: can't symlink $filePath to $symLinkDirectory$fileName: $!\n";