Одним из быстрых способов избежать всех не алфавитных символов в строке является использование операторов \ Q и \ U, например:
# assuming $outname already contains the required path and
# globally "unescaping" file chars / and .
($outname = "\Q$outname\U") =~ s/\\([\/\.])/$1/g;
Одна вещь, которую следует учитывать, - это длинная строка выполнениятакие кошки, как у вас, как правило, трудно читать и поддерживать.Лучшим способом представления этой операции может быть разбиение ее на логические единицы, например:
my $basename = '/home/jebsky/safehouse/music/mp3';
my $dirpath = "${basename}/${initial}/${artist}/${year}-${album}/";
my $filename = "${track}-${artist}-${title}.mp3";
$outname = "${dirpath}/${filename}";
Внутри строк представление переменной в виде "$ {varname}" гарантирует, что символ, следующий за именем переменной, не можетмешать ему, и, как правило, это хорошая идея, даже если следующий символ после переменной не алфавитно-цифровой, потому что он четко помечает переменные в строке.
Наконец, я думаю, что стоит отказаться от использования '"'и' \ '' как разделители строк, так как они требуют кавычек, если строка содержит разделитель.
Используйте разделители qq // и q // (заменив / символом, не отображаемым в строке, есливместо этого), как в:
my $basename = q!/home/jebsky/safehouse/music/mp3!;
my $dirpath = qq!${basename}/${initial}/${artist}!;
my $filename = qq!${year}-${album}/${track}-${artist}-${title}.mp3!;
$outname = qq!${dirpath}/${filename}!;
Таким образом, вам редко придется указывать любой символ в строке.