Функции, использующие регулярные выражения


Функции, использующие регулярные выражения
Фактически, есть три функции, которые в качестве разделителя могут использовать регулярные выражение: split, grep, map
Фактически, есть три функции, которые в качестве разделителя могут использовать регулярные выражение: split, grep, map и еще можно воспользоваться специальными операторами ... и .. и используемыми совместно с ними условиями if, unless и просто логическими операторами.

split

Если необходимо разделить данные из STDIN по нужному разделителю, то можно воспользоваться локализацией $/:


sub example_local{
  local $/ = undef;
  @mass= split /pattern/, <>;
  return 1;
}
print scalar(@mass); 
Можно разделять данные из файла и так:
undef $/;
@res=split /pattern/, <F>;
что эквивалентно:
while (<F>) {push @asdf, split}
После split можно ставить вместо запятой и стрелочку:
@mass = split /(\d){4}/ => $file;

В функции сплит можно воспользоваться макисмальным квантификатором *, который в том числе и о символов, позволит разделить строку на символы, которых там нет(в силу того, что * это 0 и более символов), т.е. посимвольно:

@ruru = split /\001*/ => "lalalalalala";
#массив @ruru будет содержать элементы по одной букве.
Если строка состоит из нескольких строк, то можно поставить разделителем и символ начала новой строки:
  $str = "asdf\nghjk\nqwer\n";
  @lines = split /^/ => $str;
Вобщем, в split можно вставлять любой поиск по шаблону.

grep

Функция grep так-же позволяет запонять массив значениями. Например нужно получить список расширений файлов в заданной директории:
while(<$dir/*.*>){push @files, $_}             #читаем директорию
@test = grep { s|.*/(.*?)\.(.*)|$2| } @files;  #оставляем в директории только расширения файлов
можно использовать признак четности для занесения в массив:
@test1=qw(1 2 3 4 5 6 7 8 9);
@evens = grep($_%2 == 1) @test1;
Или более сложное регулярное выражение для вытаскивания всех e-mail адресов из текстовой странички:
@mass=grep{s/(.*) ([\w+\-\.]+\@[\w\-\.]+\.\w{2,3})(.*)/$2/ig} split /\n/, $test;
Здесь используется укороченная запись:
@mass=grep {/pattern/} split /\n/, $test;
которая эквивалента записи из двух сторчек:
@uuu=split /\n/, $test;
@mass=grep {/pattern/} @uuu;

map

Функция map похожа по своей работе на обычное условие if, допустим нужно разделить записи на блоки, разделенные четырьмя пробелами:

@probel = map m!\s{4}!, split /\n/, $test;

other

Вывод строк из заданного интервала для данной строки:
if(/pattern1/i .. /pattern2/i){...}
#истинность первого оператора включает конструкцию, а второго её выключает.
if($nomer1 .. $nomer2){...}
... не возвратит истину, в отличии от .., если условия выполняются в одной строке.
if(/pattern1/i ... /pattern2/i){...}
if($nomer1 ... $nomer2){...}
для многострочного файла
print -ne 'print if 3 .. 15' file.txt
выведет строки файла с 3 по 15 строчку, та-же самая опреация но немного по другому:
open F, "<file";
while(<F>){
  print if(3 .. 15)
}
или с какой нибудь начальной и конечно разметкой, например есть вспомогательный файл шаблонов(просто различные виды html, в зависимости от действия пользователя) для разных определенны случаев, которые нужны исходя из контекста программы:
open F, "<file";
while(<F>){
  print if(/<!--begin welcome-->/i ... /<!--end welcome-->/i)
}
Такая конструкция позволяет выводить куски многострочного html кода(для однострочного нужно ставить оператор ..). Условия в таких операторах можно ставить и разнотипными
$file=qr/2345/;
while(<F>){
  print if(/^$/ .. 10); #увидим, что находится от пустой до 10-й строки
  print if(/^\001/ .. /$file/); #выведет все, что после нуля и до того что задано qr
}
Программа чтения почтовых адресов из mbox или sent-mail:
while(<F>){
  next unless /^From:?\s/i .. /^$/;
  while (/([^<>(,;)\s]+\@[^<>(,;)\s]+)/)g{
    print "$1\n" unless $test{$1}++;
  }
}
запускается ./regex.pl /root/mail/sent-mail и выводит каждый емейл по одному разу.

Оценить Статью:  
1   2   3   4   5   6   7   8   9   10    

« Назад
SAPE все усложнил?

MainLink - простая и прибыльная продажа ссылок!

Последние поступления:

Размещена 10 августа 2020 года

Я по ТВ видел, что через 10 лет мы будем жить лучше, чем в Германии...
Я не понял, что это они с Германией сделать хотят?!

читать далее…

ТехЗадание на Землю

Размещена 14 марта 2018 года

Пpоект Genesis (из коpпоpативной пеpеписки)

читать далее…

Шпаргалка по работе с Vim

Размещена 05 декабря 2017 года

Vim довольно мощный редактор, но работа с ним не всегда наглядна.
Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.

читать далее…

Ошибка: Error: Cannot find a valid baseurl for repo

Размещена 13 сентабря 2017 года

Если возникает ошибка на centos 5 вида
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/

читать далее…

Linux Optimization

Размещена 30 июля 2012 года

Prelink

читать далее…