---
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
---

Perl 5 -- высокоуровневый мощный язык с 25-летней историей. 
Особенно хорош для обработки разнообразных текстовых данных. 

Perl 5 работает более чем на 100 платформах, от портативных устройств
до мейнфреймов, и подходит как для быстрого прототипирования, 
так и для крупных проектов. 

```perl
# Комментарии начинаются с символа решетки.


#### Типы переменных в Perl

#  Скалярные переменные начинаются с знака доллара $.
#  Имя переменной состоит из букв, цифр и знаков подчеркивания, 
#  начиная с буквы или подчеркивания. 

### В 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",
        );

# Важно: вставка и поиск в хеше выполняются за константное время, 
# независимо от его размера.

# Скаляры, массивы и хеши подробно описаны в разделе perldata
# (perldoc perldata).

# Более сложные структуры данных можно получить, если использовать ссылки.
# С помощью ссылок можно получить массив массивов хешей, в которых хранятся другие хеши.

#### Условные операторы и циклы

# В Perl есть большинсво привычных условных и циклических конструкций.

if ( $var ) {
    ...
} elsif ( $var eq 'bar' ) {
    ...
} else {
    ...
}

unless ( condition ) {
                   ...
               }
# Это более читаемый вариант для "if (!condition)"

# Специфические Perl-овые пост-условия: 
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";
               }

#### Регулярные выражения

# Регулярные выражения занимают важное место в Perl-е,
# и подробно описаны в разделах документации 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: $!";

# Читать из файлового дескриптора можно с помощью оператора "<>".  
# В скалярном контексте он читает одну строку из файла, в списковом -- 
# читает сразу весь файл, сохраняя по одной строке в элементе массива:

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-модули

Perl-овые модули предоставляют широкий набор функциональности, 
так что вы можете не изобретать заново велосипеды, а просто скачать 
нужный модуль с CPAN (http://www.cpan.org/). 
Некоторое количество самых полезных модулей включено в стандартную 
поставку Perl.

Раздел документации perlfaq содержит вопросы и ответы о многих частых 
задачах, и часто предлагает подходящие CPAN-модули.


#### 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.


#### Смотрите также

 - [perl-tutorial](http://perl-tutorial.org/)
 - [обучающий раздел на www.perl.com](http://www.perl.org/learn.html)
 - [perldoc в вебе](http://perldoc.perl.org/)
 - встроенная справка : `perldoc perlintro`
