Я новичок в функции map и grep, и я пытаюсь сделать существующий сценарий более кратким.Perl Map Function
Я могу успешно «grep» @tracknames, но у меня проблема с «картой». Я хочу, чтобы @trackartist возвращал true, если два последовательных «-» находятся в строке и принимают значение $ 1, в противном случае значение false, но возвращает всю строку, если верхнее условие не выполняется. Что я делаю неправильно?
my @tracknames = grep /^\d\d\..*?(\.(?:flac|wv))$/, <*.*>;
my @trackartist = map { s/^\d\d\.\s(.*?)\s--.*?\.(?:flac|wv)$/$1/; $_; } <*.*>;
Sample of files
01. some track artist 1 -- some track name 1.(flac or wv)
02. some track artist 2 -- some track name 2.(flac or wv)
03. some track artist 3 -- some track name 3.(flac or wv)
etc.
Не могли бы вы уточнить, что вы хотите? ('@ trackartist' - это массив, он ничего не возвращает * per se *.) Было бы полезно, если бы мы увидели список файлов, которые вы хотели:' <*.*> 'glob'd и содержимое' @ trackartist' вас разыскивается. – pilcrow
Я думаю, вы можете смутить насчет 'map'. Принимая во внимание, что имеет смысл подчеркнуть истинно-ложную оценку, когда речь идет о «grep», на самом деле это не точка «карты». Более подробную информацию о различии между 'grep' и' map' см. По адресу http://stackoverflow.com/questions/575490/whats-the-difference-between-grep-and-map-in-perl/576044#576044. – FMc
Я опубликовал образец возможной структуры имени файла. С @tracknames я grep все имя файла с расширениями, но я также хочу grep или назначить массив именам исполнителя трека, если они существуют, а затем использовать с $ trackartist [cnt ++] для целей s ///. – thebourneid