2014-11-28 11:36:41 +03:00
|
|
|
|
---
|
|
|
|
|
category: language
|
|
|
|
|
language: perl
|
|
|
|
|
filename: learnperl-ru.pl
|
|
|
|
|
contributors:
|
|
|
|
|
- ["Korjavin Ivan", "http://github.com/korjavin"]
|
|
|
|
|
translators:
|
|
|
|
|
- ["Elena Bolshakova", "http://github.com/liruoko"]
|
|
|
|
|
lang: ru-ru
|
|
|
|
|
---
|
|
|
|
|
|
2020-06-10 13:48:01 +03:00
|
|
|
|
Perl -- высокоуровневый мощный язык с 25-летней историей.
|
|
|
|
|
Особенно хорош для обработки разнообразных текстовых данных.
|
2014-11-28 11:36:41 +03:00
|
|
|
|
|
2020-06-10 13:48:01 +03:00
|
|
|
|
Perl работает более чем на 100 платформах, от портативных устройств
|
|
|
|
|
до мейнфреймов, и подходит как для быстрого прототипирования,
|
|
|
|
|
так и для крупных проектов.
|
2014-11-28 11:36:41 +03:00
|
|
|
|
|
|
|
|
|
```perl
|
|
|
|
|
# Комментарии начинаются с символа решетки.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Типы переменных в Perl
|
|
|
|
|
|
|
|
|
|
# Скалярные переменные начинаются с знака доллара $.
|
2020-06-10 13:48:01 +03:00
|
|
|
|
# Имя переменной состоит из букв, цифр и знаков подчеркивания,
|
|
|
|
|
# начиная с буквы или подчеркивания.
|
2014-11-28 11:36:41 +03:00
|
|
|
|
|
|
|
|
|
### В Perl три основных типа переменных: скаляры, массивы, хеши.
|
|
|
|
|
|
|
|
|
|
## Скаляры
|
|
|
|
|
# Скаляр хранит отдельное значение:
|
|
|
|
|
my $animal = "camel";
|
|
|
|
|
my $answer = 42;
|
|
|
|
|
|
|
|
|
|
# Скаляры могут быть строками, целыми и вещественными числами.
|
|
|
|
|
# Когда требуется, Perl автоматически выполняет преобразования к нужному типу.
|
|
|
|
|
|
|
|
|
|
## Массивы
|
|
|
|
|
# Массив хранит список значений:
|
|
|
|
|
my @animals = ("camel", "llama", "owl");
|
|
|
|
|
my @numbers = (23, 42, 69);
|
|
|
|
|
my @mixed = ("camel", 42, 1.23);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Хеши
|
|
|
|
|
# Хеш хранит набор пар ключ/значение:
|
|
|
|
|
|
|
|
|
|
my %fruit_color = ("apple", "red", "banana", "yellow");
|
|
|
|
|
|
|
|
|
|
# Можно использовать оператор "=>" для большей наглядности:
|
|
|
|
|
|
|
|
|
|
my %fruit_color = (
|
|
|
|
|
apple => "red",
|
|
|
|
|
banana => "yellow",
|
|
|
|
|
);
|
|
|
|
|
|
2020-06-10 13:48:01 +03:00
|
|
|
|
# Важно: вставка и поиск в хеше выполняются за константное время,
|
2014-11-28 11:36:41 +03:00
|
|
|
|
# независимо от его размера.
|
|
|
|
|
|
|
|
|
|
# Скаляры, массивы и хеши подробно описаны в разделе perldata
|
|
|
|
|
# (perldoc perldata).
|
|
|
|
|
|
|
|
|
|
# Более сложные структуры данных можно получить, если использовать ссылки.
|
|
|
|
|
# С помощью ссылок можно получить массив массивов хешей, в которых хранятся другие хеши.
|
|
|
|
|
|
|
|
|
|
#### Условные операторы и циклы
|
|
|
|
|
|
|
|
|
|
# В Perl есть большинсво привычных условных и циклических конструкций.
|
|
|
|
|
|
|
|
|
|
if ( $var ) {
|
|
|
|
|
...
|
|
|
|
|
} elsif ( $var eq 'bar' ) {
|
|
|
|
|
...
|
|
|
|
|
} else {
|
|
|
|
|
...
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unless ( condition ) {
|
|
|
|
|
...
|
|
|
|
|
}
|
|
|
|
|
# Это более читаемый вариант для "if (!condition)"
|
|
|
|
|
|
2020-06-10 13:48:01 +03:00
|
|
|
|
# Специфические Perl-овые пост-условия:
|
2014-11-28 11:36:41 +03:00
|
|
|
|
print "Yow!" if $zippy;
|
|
|
|
|
print "We have no bananas" unless $bananas;
|
|
|
|
|
|
|
|
|
|
# while
|
|
|
|
|
while ( condition ) {
|
|
|
|
|
...
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# for, foreach
|
|
|
|
|
for ($i = 0; $i <= $max; $i++) {
|
|
|
|
|
...
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (@array) {
|
|
|
|
|
print "This element is $_\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for my $el (@array) {
|
|
|
|
|
print "This element is $el\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#### Регулярные выражения
|
|
|
|
|
|
2015-06-10 11:00:00 +03:00
|
|
|
|
# Регулярные выражения занимают важное место в Perl-е,
|
2014-11-28 11:36:41 +03:00
|
|
|
|
# и подробно описаны в разделах документации perlrequick, perlretut и других.
|
|
|
|
|
# Вкратце:
|
|
|
|
|
|
|
|
|
|
# Сопоставление с образцом
|
|
|
|
|
if (/foo/) { ... } # выполняется, если $_ содержит "foo"
|
|
|
|
|
if ($a =~ /foo/) { ... } # выполняется, если $a содержит "foo"
|
|
|
|
|
|
|
|
|
|
# Простые замены
|
|
|
|
|
|
|
|
|
|
$a =~ s/foo/bar/; # заменяет foo на bar в строке $a
|
|
|
|
|
$a =~ s/foo/bar/g; # заменяет ВСЕ ВХОЖДЕНИЯ foo на bar в строке $a
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Файлы и ввод-вывод
|
|
|
|
|
|
|
|
|
|
# Открыть файл на чтение или запись можно с помощью функции "open()".
|
|
|
|
|
|
|
|
|
|
open(my $in, "<", "input.txt") or die "Can't open input.txt: $!";
|
|
|
|
|
open(my $out, ">", "output.txt") or die "Can't open output.txt: $!";
|
|
|
|
|
open(my $log, ">>", "my.log") or die "Can't open my.log: $!";
|
|
|
|
|
|
2024-06-03 22:31:20 +03:00
|
|
|
|
# Читать из файлового дескриптора можно с помощью оператора "<>".
|
2020-06-10 13:48:01 +03:00
|
|
|
|
# В скалярном контексте он читает одну строку из файла, в списковом --
|
2014-11-28 11:36:41 +03:00
|
|
|
|
# читает сразу весь файл, сохраняя по одной строке в элементе массива:
|
|
|
|
|
|
|
|
|
|
my $line = <$in>;
|
|
|
|
|
my @lines = <$in>;
|
|
|
|
|
|
|
|
|
|
#### Подпрограммы (функции)
|
|
|
|
|
|
|
|
|
|
# Объявить функцию просто:
|
|
|
|
|
|
|
|
|
|
sub logger {
|
|
|
|
|
my $logmessage = shift;
|
|
|
|
|
open my $logfile, ">>", "my.log" or die "Could not open my.log: $!";
|
|
|
|
|
print $logfile $logmessage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Теперь можно использовать эту функцию так же, как и встроенные:
|
|
|
|
|
|
|
|
|
|
logger("We have a logger subroutine!");
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### Perl-модули
|
|
|
|
|
|
2020-06-10 13:48:01 +03:00
|
|
|
|
Perl-овые модули предоставляют широкий набор функциональности,
|
|
|
|
|
так что вы можете не изобретать заново велосипеды, а просто скачать
|
2024-06-03 22:31:20 +03:00
|
|
|
|
нужный модуль с [CPAN](http://www.cpan.org/).
|
2020-06-10 13:48:01 +03:00
|
|
|
|
Некоторое количество самых полезных модулей включено в стандартную
|
2014-11-28 11:36:41 +03:00
|
|
|
|
поставку Perl.
|
|
|
|
|
|
2020-06-10 13:48:01 +03:00
|
|
|
|
Раздел документации perlfaq содержит вопросы и ответы о многих частых
|
2014-11-28 11:36:41 +03:00
|
|
|
|
задачах, и часто предлагает подходящие CPAN-модули.
|
|
|
|
|
|
2015-06-10 11:27:02 +03:00
|
|
|
|
|
|
|
|
|
#### Unicode
|
|
|
|
|
|
|
|
|
|
Вам наверняка понадобится работать с не-ASCII текстами.
|
|
|
|
|
Добавьте эти прагмы в начало скрипта:
|
|
|
|
|
|
|
|
|
|
```perl
|
|
|
|
|
use utf8;
|
|
|
|
|
use open ':std' => ':utf8';
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Подробнее читайте в perldoc, разделы perlunicode и open.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### strict, warnings
|
|
|
|
|
|
|
|
|
|
Прагмы strict и warnings включают полезные проверки во время компиляции:
|
|
|
|
|
|
|
|
|
|
```perl
|
|
|
|
|
use strict;
|
|
|
|
|
use warnings;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Подробнее смотрите perldoc strict и perldoc warnings.
|
|
|
|
|
|
|
|
|
|
|
2014-11-28 11:36:41 +03:00
|
|
|
|
#### Смотрите также
|
|
|
|
|
|
|
|
|
|
- [perl-tutorial](http://perl-tutorial.org/)
|
|
|
|
|
- [обучающий раздел на www.perl.com](http://www.perl.org/learn.html)
|
|
|
|
|
- [perldoc в вебе](http://perldoc.perl.org/)
|
|
|
|
|
- встроенная справка : `perldoc perlintro`
|