Perl - интерпретируемый язык высокого уровня. Был разработан Ларри Уоллом в 1987 году как скриптовый язык общего назначения для UNIX. С тех пор язык претерпел множество изменений и стал широко популярным среди программистов. Ларри Уолл продолжает следить за развитием основных возможностей языка и его следующей версии, Perl 6.

Perl заимствует особенности других языков программирования, включая C, языке сценариев командной оболочки (sh), AWK, и т.д. Язык предоставляет собой мощное средство обработки текста, что облегчает работу с текстовыми файлами. Он получил широкую популярность в конце 1990-х как язык сценариев CGI, в частности, из-за его способности разбора.

В дополнение к CGI, Perl используется для графического программирования, системного администрирования, сетевого программирования, финансов, биоинформатика и других приложений. Perl был прозван как “швейцарский нож среди языков программирования” из-за его гибкости и мощности. Он также называется “клейкой лентой, которая соединяет Интернет вместе”.

Этому языку посвящено множество сайтов для пользователей различного уровня. Периодически проводятся встречи, есть русскоязычный журнал о Perl “Pragmatic Perl” (анонс и ссылки в конце страницы ). Так же есть сайт, на котором есть подробные интерактивные уроки для новичков.

Математические операции

1
2
3
4
5
6
 +  сложение. пример 2+4=6
 -   вычитание. 7-4=3
 *  умножение. 2*3=6
 /   деление
 % остаток. Например, 5%2=1
 ** возведение в степень

апостроф и кавычки (одинарные и двойные кавычки)

  • Данные в одинарных кавычках читаются посимвольно.

  • Данные в двойных кавычках могут содержать управляющие символы (например, \n).

Управляющие символы

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 \n новая строка
 \r возврат курсора
 \t табуляция
 \f подача страницы
 \b бэкспейс
 \a звуковой сигнал
 \e эскейп
 \cC контроль с чем-то, в данном случае с C
 \\ косая черта
 \l следующий символ в нижний регистр
 \L все следующие символы в нижний регистр, пока не встретят \E
 \u следующий символ в верхний регистр
 \U все следующие символы в верхний регистр, пока не встретят \E
 \Q вплоть до команды \Е все последующие метасимволы становятся обычными символами
 \E отмена \L, \U и \Q

Символ точка и повторение строки

Точка помогает объединить строки. Например

1
 "text" . "/n"

даст текст и перевод строки

1
2
 text
 

Или

1
 "L=" . 3*5

выдаст

L=15

Повторение данных делается просто с помощью икса (x). Например:

1
 print "text"x3;

даст

texttexttext

а эта строка

1
 print "text\n"x3;

даст

1
2
3
 text
 text
 text

Дебажим

В начало файла после

1
#/usr/bin/perl

можно добавить

use warnings;

это выдаст в консоль ошибки, если они есть. Например:

1
print "2tex"*4;

выдаст

1
2
 Argument "2tex" isn't numeric in multiplication (*) at tochka.pl line 4.
 8

То есть ругнулся, но выполнил перемножение. Более подробно можно получить данные, если вместо warnings использовать

1
 use diagnostics;

Используя прошлый пример, увидим это:

1
2
3
4
5
6
 Argument "2tex" isn't numeric in multiplication (*) at tochka.pl line 4 (#1)
    (W numeric) The indicated string was fed as an argument to an operator
    that expected a numeric value instead.  If you're fortunate the message
    will identify which operator was so unfortunate.
 
 8

Переменные

  • Скалярные переменные

Скалярные переменные начинаются с $ и могут содержать только одно значение. Например:

1
2
3
4
 $peremennaya = 10;
 print $peremennaya; #выдаст 10
 $drugaya_peremennaya = $peremennaya + 20;
 print $drugaya_peremennaya; #выдаст 30

В итоге получим 1030, мы же символ перевода строки (\n) не добавляли.

*Бинарные операции присваивания Нужны тогда, когда значение переменной нужно изменить и оставить в той же переменной. Например

1
2
3
 $peremennaya = 10;
 $peremennaya =  $peremennaya + 10; #получаем 20
 print $peremennaya; #выдаст 20

а можно и так:

1
2
3
  $peremennaya = 10;
  $peremennaya += 10; #получаем так же 20
 print $peremennaya; #выдаст 20
1
2
 *=3; умножение переменной на 3
 .=" "; добавит пробел в конце

и т.д.

Операторы

  • Операторы сравнения

Для чисел

1
2
3
4
5
6
 == равно
 != не равно
 < меньше
 > больше
 <= меньше или равно
 >= больше или равно

То же самое для строк

1
2
3
4
5
6
 eq равно
 ne не равно
 lt меньше
 gt больше
 le меньше или равно
 ge больше или равно

Оператор chomp

Оператор удаления символа новой строки. Например, если что-то нужно вывести строку без переноса.

1
2
 $stroka = "text\n";
 chomp ($stroka);

в одну строчку:

chomp ($stroka = “text\n”);

Управляющие конструкции

  • if Вид
1
2
if (){
 }

Например

1
2
3
if ($a==$b){
  print "a = b";
 }

Добавим ещё одно действие, если значение не верно.

1
2
3
4
5
6
if ($a==$b){
  print "a равно b";
 }else
 {
 print "a не равно b";
 }
  • while Поддерживает, пока условие истино. Например
1
2
3
4
5
$ver=0; #переменная равна нулю
 while ($ver < 5){ #если переменная меньше 5, то цикл повторяем
  print "ver: $ver\n"; #пишем переменную
  $ver +=1 ; #и прибавляем к ней единицу, иначе она всегда будет меньше 5 и цикл будет бесконечен
 }

Увидим что-то такое

1
2
3
4
5
6
 [root@router perl]# perl tochka.pl
 ver: 0
 ver: 1
 ver: 2
 ver: 3
 ver: 4
  • Построчный ввод

Пригодится, если нужно ввести данные с клавиатуры. Например

1
2
 $stroka = <STDIN>;
 print $stroka;

Вводите данные, жмёте Enter и программа выводит то, что написано.

Примеры

  • Выводим просто сообщение
1
2
 #!/usr/bin/perl
 print "Hi from wikiadmin.net\n";
  • Читаем данные с клавиатуры
1
2
3
4
5
 #!/usr/bin/perl
 print "Как звать тебя, юзверь? ";
 my $name = <STDIN>; #ввод с клавиатуры
 chomp $name; #убирает перевод строки после переменной
 print "Привет $name, и до свидания?\n";
  • Смотрим инфу по памяти
1
2
3
4
5
6
7
#!/usr/bin/perl
 use Sys::MemInfo qw(totalmem freemem); 
 
 print &totalmem / 1024;
 print "\n";
 print &freemem / 1024;
 print "\n";
  • Запуск внешних программ

Файл 1.pl:

1
2
3
4
 #!/usr/bin/perl
 
 my $cmd = 'free -m';
 system($cmd);

Результат perl 1.pl:

1
2
3
4
          total       used       free     shared    buffers     cached
 Mem:          1634       1348        285         35          0        165
 -/+ buffers/cache:       1183        450
 Swap:         3359       1132       2227
  • Вычисление длинны окружности, зная радиус
1
2
3
4
5
6
7
 $radius=<STDIN>; #вводим с клавиатуры значение
 if($radius > 0){ #проверяем, чтобы радиус был больше 0
  $len = 2*3.14159*$radius; #получаем значение длинны
  print "Result is: $len\n"; #выводим результат
 } else {
 print "Radius can not be less than 0!\n" #иначе ругаемся, что радиус не может быть меньше 0
 }

Игра с выводом текста в Windows в cmd UTF-8 на русском языке

Так получилось, что дочке хотелось поиграть, а маме надо было, чтобы дочка поучила цифры. Решил сделать такую своеобразную угадайку. Проблемка только в том, что нужно, чтобы в консоли Windows (cmd) Perl выводил текст на русском языке. Решено так:

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
29
30
31
32
33
34
35
 #!perl
 use strict;
 use warnings;
 use utf8;
 use threads;
 use open qw(:utf8 :std);
 use v5.20;
 use open ':std', ':encoding(cp866)';
 use open IO => ':encoding(cp1251)';
 my $randy="1";
 my $your_number="1";
 
 BEGIN: while ($randy <11) {
 $randy=int(rand(10));
 print "Введите число от 0 до 10. Наберите 11 для завершения\n";
 $your_number=<STDIN>;
 if ($your_number < $randy){
     print "ваше число меньше! ";
 }
 elsif ($your_number == "11"){
     exit 0;
 }
 elsif ($your_number > $randy){
     print "ваше число больше! ";
 }
 else { 
  print "###################################################\n"; 
  print "###################################################\n";
  print "##############   Угадала!    ######################\n";
  print "###################################################\n";
  print "###################################################\n";
 }
    print "загадано $randy\n\n\n";
 
 next BEGIN;}

Как удалить строки с определёнными символами из файла

В данном примере мы удалим все строки с комментариями (#) из файла. Итак, есть файл 1.txt

1
2
3
4
5
6
 #1
 #2
 34
 4
 5
 #9

Удалить все комментарии можно так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 #!perl
 use strict;
 use warnings;
 use utf8;
 use threads;
 use open qw(:utf8 :std);
 use v5.20;
 my $file;
 
 open(INFILE,"1.txt");
 open(OUTFILE, ">2.txt");
  my @file = <INFILE>;
  foreach $file (@file){
     $file=~s/#.*//s;
     print OUTFILE $file;
     }
 close INFILE;
 close OUTFILE;

В файле 2.txt видим это:

1
2
3
 34
 4
 5

Вообще, если файл будет большой, то программа выше может легко забить всю память и увести компьютер в SWAP. Чтобы этого не случилось, используем Tie::File и переделаем текст программы так

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!perl
 use strict;
 use warnings;
 use utf8;
 use threads;
 use open qw(:utf8 :std);
 use v5.20;
 
 use Tie::File;
 my @file;
 my $file;
 tie @file, 'Tie::File', "1.txt";
 @file = grep !/#.*/, @file;
 @file = grep /\S/, @file;
 untie @file;

Tie::File интересна тем, что позволяет работать с файлом напрямую как с массивом и иметь доступ к отдельным строкам, не загружая весь файл в память. То есть первая строка будет в массиве под номером 0, вторая под 1 и т.д. Учтите, что работа идёт над первоначальным файлом, так что имейте копию, если надо будет вернуть всё!

Журнал Pragmatic Perl

Скачать и читать Выпуск 25

В этом номере:

  • От редактора. Два года журналу, Вячеслав Тихановский

  • Подключение в Mojolicious модели для бизнес-логики, Александр Ружников

    Рассмотрен вариант автоматического подключения классов моделей из указанной директории

  • Мутационное тестирование, Вячеслав Тихановский

    Еще один способ сделать Perl-код качественнее — мутировать тесты для нахождения непротестированного кода

  • Про переменные и сигнатуры в Perl 6, Андрей Шитов

    В этой статье описаны интересные синтаксические возможности Perl 6, о которых не было упомянуто в прошлый раз

  • Модули в Perl 6, Андрей Шитов

    Краткий обзор основных моментов, которые полезно знать при работе с модулями в Perl 6

  • Обзор CPAN за февраль 2015 г., Владимир Леттиев

    Рубрика с обзором интересных новинок CPAN за прошедший месяц.

  • Интервью с Владимиром Леттиевым, Вячеслав Тихановский

    Владимир Леттиев (crux) — постоянный автор журнала, модулей на CPAN, основатель perlnews.ru