РЕДАКТИРОВАТЬ 2 (после более подробных комментариев ОП ниже):
(Цитировать слегка перефразированное сообщение ОП + комментарии):
Оставьте только те элементы массива, которые имеют одну или несколько букв или di git. Удалите все остальные начальные и конечные символы.
Полное решение, которое короче, надежнее и более perl -i sh, равно grep
и map
с несколькими операциями. все упаковано внутри.
@array = grep { $_ ne q{} }
map {
$_ = substr $_, 0, 10;
s{\A[^A-Za-z0-9]+|[^A-Za-z0-9]+\z}{}g;
$_
} <$file>;
Подробности:
<$file>
возвращает все содержимое файла в виде массива.
map
работает с каждым элементом, по умолчанию с псевдонимом $_
. Он возвращает $_
после изменений - поэтому $_
явно добавляется в конце, так как последнее, что map
оценивает.
\A
- начало строки.
\z
- это строка конец строки.
[^A-Za-z0-9]+
- любой не {символ или буква}, повторенный 1 или более раз.
grep { $_ ne q{} }
удаляет пустые строки.
Почему s/^\s+|\s+\z//g for @array;
не работает?
Удаляет только начальные и конечные только пробелы . Он не удаляет другие не {di git или буквенные символы}, такие как '.'
или '_'
. Он также не удаляет пустые строки из массива, например, те, которые являются результатом элементов массива всех пробелов (например, "\t \t"
), которые были заменены пустой строкой: ""
. Например, эта подстановка регулярных выражений изменит этот массив из 2 элементов: (" . a. ", "\t \t")
в этот массив из 2 элементов: (". a.", "")
- не то, что вы хотите.
СМОТРИТЕ ТАКЖЕ:
Документы для Perl регулярных выражений , map
и grep
содержат более подробную информацию.