В вашем коде $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";