Regex позволяет вам кодировать требования в «шаблон» с гораздо большей точностью:
my @filtered = grep { m{^/tmp/[0-9]+\.hash$} } @all;
Я использую {}
для разделителей, так как с обычными //
каждый в /
вшаблон должен быть экранирован.Тогда m
требуется впереди (в отличие от //
разделителей, где он может быть опущен).
Якорь ^
соответствует началу строки (и в других позициях, если действует «модификатор» /m
) † .Кажется, что /tmp
является началом пути, но если бы перед ним были (например) пробелы, то вышеприведенное не совпадало бы (если вы не измените его на ^\s*/tmp
, чтобы учесть дополнительные пробелы).Внимательно рассмотрите свои данные.
$
соответствует концу строки или перед новой строкой в конце, если она есть (модификатор /m
меняет это) † .Чтобы также сопоставлять строки с большим количеством символов после hash
, удалите $
.
Сам шаблон определяет то, что вы говорите в описании проблемы: должно быть целое число, которое меняется, а остальное исправлено.
Собственная (отличная) документация Perl поставляется с учебным пособием perlretut .
† С модификатором $str =~ /.../m
,строка обрабатывается как многострочная строка, поэтому если в ней есть переводы строк, то ^
и $
в этом регулярном выражении также соответствуют началу и концу каждой строки.
Якорь, который всегда соответствуеттолько конец строки равен \z
(также см. \Z
, что соответствует $
, но нечувствительно к /m
).См. Утверждения в perlre и ответы на на этой странице .