Название
grep — это встроенная в Perl функция, которая ищет в списке элементы, удовлетворяющие заданному условию. Используется для извлечения и преобразования данных.
Отличается от стандартной unix-программы grep тем, что стандартный grep выполняет поиск строк в одном или нескольких файлах, соответствующие заданному регулярному выражению.
Синтаксис
|
1 2 |
grep EXPR, LIST grep BLOCK LIST |
Описание
Функция вычисляет EXPR или BLOCK для каждого элемента LIST.
В списковом контексте возвращает элементы, для которых выражение EXPR или BLOCK является истинным. В скалярном контексте возвращает число — сколько элементов LIST соответствует заданному условию.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/usr/bin/perl -w use strict; my @list = qw(письма и телеграммы сгорели очень быстро и дотла были их килограммы теперь осталась только лишь зола); my @result = grep /и/i, @list; my $result_num = grep /и/i, @list; foreach (@result) {print $_." "}; print "\n".$result_num."\n"; |
Вывод:
|
1 2 3 4 5 |
%perl grep.pl письма и сгорели и были их килограммы лишь 8 % |
Во время работы функция grep поочередно присваивает переменной $_ значения элементов из списка, и проверяет это значение на соответствие заданному условию. Одновременно с отбором элементов, можно вносить в них изменения.
Главное при этом помнить, что EXPR или BLOCK могут выполнять модификацию исходного списка.
|
1 2 3 4 5 6 |
my @list = qw(письма и телеграммы сгорели очень быстро и дотла были их килограммы теперь осталась только лишь зола); my @result = grep s/и/i/, @list; foreach (@list) {print $_." "}; |
Вывод:
|
1 2 3 4 |
%perl grep.pl пiсьма i телеграммы сгорелi очень быстро i дотла былi iх кiлограммы теперь осталась только лiшь зола |
Примеры
Поиск в сложной структуре данных
Есть список кандидатов на вакансию. Каждый кандидат обладает определенными навыками. Надо найти имена тех кандидатов, которые обладают списком заданных навыков (например: perl и mysql).
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/usr/bin/perl -w use strict; my %persons = ( 'Мария' => [qw(html css mysql php perl xml apache)], 'Сергей' => [qw(perl ruby apache nginx xml)], 'Василий' => [qw(php html mysql)], 'Захарий' => [qw(mysql oracle perl)], ); my @names = grep { grep /mysql/, @{$persons{$_}} if grep /perl/, @{$persons{$_}}; } keys %persons; foreach (@names) {print $_." "}; |
Вывод:
|
1 |
Захарий Мария |
Поиск в сложной структуре данных — 2
Требуется вывести имена сотрудников, специализирующихся на работе с oracle.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
my @dbs = ( { 'name' => 'Natalie Ani', 'specialization' => 'perl', 'phone' => '4633', }, { 'name' => 'Mary Smirnova', 'specialization' => 'ruby', 'phone' => '4323', }, { 'name' => 'Alex Kravchik', 'specialization' => 'oracle', 'phone' => '4566', }, { 'name' => 'Alex Orlikov', 'specialization' => 'oracle', 'phone' => '4567', }, ); my @res = grep { $dbs[$_]->{'specialization'} eq 'oracle' } 0..$#dbs; foreach (@res) {print $dbs[$_]->{'name'}." "}; |
Вывод:
|
1 2 3 |
%perl grep.pl Alex Kravchik Alex Orlikov |
Поиск одновременно в нескольких массивах
|
1 |
my @names = grep /^А/, (@women_names, @men_names); |
Поиск элементов по численному значению
|
1 2 3 |
my @num = qw(12 13 500 76 27 262 1 5 150 89 8); my @res = grep {$_ < 100} @num; |