Perl Regex Вывод только символов, которые могут быть использованы в качестве имени файла Unix - PullRequest
1 голос
/ 26 декабря 2010

Я написал базовый mp3-скрипт для себя.У меня есть строка: $outname = "/home/jebsky/safehouse/music/mp3/" . $inital . "/" . $artist . "/" . $year ." - ". $album . "/" . $track ." - ". $artist ." - ". $title . ".mp3";

Я хочу, чтобы регулярное выражение изменилось $outname, чтобы любой небезопасный для символов имени файла был заменен подчеркиванием

Ответы [ 2 ]

1 голос
/ 26 декабря 2010

Если какой-либо из ваших компонентов включает «/», вы действительно хотите выполнить подстановку для них перед тем, как соберет их в $ outname.

Какие безопасные символы могут отличаться от одной операциисистема и / или файловая система к другому.Многие файловые системы не имеют проблем с любыми символами, кроме "/" и nul.Вероятно, вам лучше решить, какие символы вы хотите сохранить, по другим причинам, чем те, которые допускает ваша файловая система.

В следующем примере сохраняются только буквы и цифры, заменяя последовательности других символов на _:

for ( $initial, $artist, $year, $album, $track, $title ) {
    s/[^A-Za-z0-9]+/_/g;
}
0 голосов
/ 20 мая 2011

Одним из быстрых способов избежать всех не алфавитных символов в строке является использование операторов \ 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}!;

Таким образом, вам редко придется указывать любой символ в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...