Помните, что grep
для фильтрации списка, а map
для преобразования списка.Прямо сейчас ваш оператор map
возвращает $_
для каждого элемента в списке.Если $_
соответствует шаблону в вашей замене, он будет изменен и заменен первым соответствием.В противном случае он не изменяется и возвращается исходный $_
.
Похоже, вы хотите отфильтровать элементы, которые не соответствуют шаблону.Одним из способов было бы объединить карту и grep:
my @trackartist = map { s/^\d\d\.\s(.*?)\s--.*?\.(?:flac|wv)$/$1/; $_; }
grep { /^\d\d\.\s(.*?)\s--.*?\.(?:flac|wv)$/ } <*.*>;
Конечно, это означает, что вы выполняете одно и то же сопоставление с шаблоном дважды.Другой подход заключается в том, чтобы выполнить преобразование с map
, но преобразовать все, что не соответствует шаблону, в пустой список.
my @trackartist = map { /^\d\d\.\s(.*?)\s--.*?\.(?:flac|wv)$/ ? $1 : ( ) } <*.*>
При этом используется троичный условный оператор (?:
) для проверкирегулярное выражение совпадает (возвращая истинное значение).Если это так, $1
возвращается из блока map
, если нет, возвращается пустой список ( )
, который ничего не добавляет к списку, являющемуся результатом map
.
.Обратите внимание, что вы можете захотеть использовать функцию glob вместо <>
, что имеет некоторые недостатки.