Симлинк две директы в perl - PullRequest
1 голос
/ 17 июня 2019

У меня есть код ниже для символической ссылки два каталога ..

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);

Это прекрасно работает, когда я запускаю его локально .. но когда я объединил это с другим сценарием, это выдает ошибку ..

Global symbol "$fileName" requires explicit package name (did you forget to declare "my $fileName"?) at

Есть идеи, почему это произошло?почему работает локально, а не в сочетании?

1 Ответ

2 голосов
/ 17 июня 2019

В вашем коде $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" самостоятельно.Это не скрипт оболочки.

symlink может дать сбой.Ваш код, вероятно, должен проверить это:

    symlink($filePath, $symLinkDirectory . $fileName) or warn "$0: can't symlink $filePath to $symLinkDirectory$fileName: $!\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...