Вероятно, вы хотите что-то вроде:
use File::Copy;
sub construct_filename {
my ($dir, $name, $counter) = @_;
if ($name =~ /^(.*)\.(.*)$/) {
return "$dir/$1.$counter.$2";
} else {
return "$dir/$name.$counter";
}
}
if (-e "$destination$filename") {
$counter = 1;
while (-e construct_filename($destination,$filename,$counter)) {
$counter++;
}
move("/tmp/$filename", construct_filename($destination,$filename,$counter));
} else {
move("/tmp/$filename", "$destination$filename");
}
Кроме того, оператор объединения строк в perl имеет значение .
, а не +
. То, что вы написали, вообще не сработает. В этом случае вы можете просто использовать интерполяцию строк в двойных кавычках и не беспокоиться о конкатенации.
И для чего бы это ни стоило, более простое соглашение для каталогов - никогда не содержать завершающие косые черты и всегда использовать их при создании имен файлов (например, "$destination/$filename"
). Как уже отмечали другие, самый надежный способ построения пути - это File::Spec
. Из того, что я мог сказать, однако, часть, которую вы действительно искали, состояла в том, как сделать добавочное именование; поэтому я дал четкую и краткую версию этого. Обновите до File::Spec
, как считаете нужным!