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


#### Типы переменных в 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!");

use utf8;
use open ':std' => ':utf8';

use strict;
use warnings;

