Perl - курсы Лекция 1


Синтаксис языка

Простые конструкции


my $var;        # Обьявление переменной
my $a = 42;     # Присвоение переменной значниея
print "test";   # Вывод в STDOUT
eval {};        # Выполнение кода с крит. ошибкой
do {};          # Просто выполнение блок кода

Блок


{
    # Здесь можно писать код
}

Условия - if


if ( $a > $b ){
    print "a > b";
}

if ( $a > $b ){
    print "a > b";
} else {
    print "something else";
}

if ( $a > $b ){
    print "a > b";
} elsif ( $a > $c ){
    print "a > c";
} else {
    print "something else";
}

Условия - unless


unless ( $a > $b ){
    print 'b > a';
}

Циклы while/until

Пока условие истина


my $a = 0;
while ( $a < 3 ){
    $a++;
    print "$a\n";
}
=head
1
2
3

Пока условие ложно


my $a = 0;
until ( $a > 3 ){
    $a++;
    print "$a\n";
}
=head
1
2
3
4

Цикл с пост усовием пока истина


my $a = 0;
do {
    $a++;
    print "$a\n";
} while ($a < 3);
=head
1
2
3

my $a = 0;
do {
    print "$a\n";
    $a++;
} until ( $a > 3 );
=head
0
1
2
3

Циклы for/foreach


for (my $i = 0; $i < 3; $i++){
    print "$i\n";
}
=head
0
1
2

my @list = (1,2,3);
for ( @list ){
    print "$_\n";
}
=head
2
3

my @list = (1,2,3);
for my $a ( @list ){
    print "$a\n";
}
=head
1
2
3

my @list = (1,2,3);
print "$_\n" for ( @list );
=head
1
2
3

Встроенные функций

warn, eval, die


eval "$a/$b";
warn $@ if $@;
=head
syntax error at (eval 4) line 1, at EOF

eval { $a / $b };
warn $@ if $@;
=head
Illegal division by zero at simple.pl line 73.

eval { die "Not root" if $< };
warn $@ if $@;

Реализация try/catch


eval {
    100 / 0;
1} or do {
    warn "Error: $@";
}
=head
Error: Illegal division by zero at simple.pl line 80.

chop, chomp

chop - вырезает 1 символ с конца строки
chomp - вырезает 1 спец символ с конца строки


my $a = $b = "test\t\n";
say chop($a) . chop($a) . chop($a); # \n, \t, t
say $a;

say chomp($b) . chomp($b) . chomp($b); # \n, \t, ''
say $b;
=head

    t
tes
100
test    

index, rindex, substr, length


#         ↓─────index($_," ") # 4
$_ = "some average string\n";
#        └─┬─┘    ↑───rindex($_," ") # 12
#          substr($_,3,5) = "e ave"

lc, lcfirst, uc, ucfirst


my $big = 'WORD';
my $small = 'word';
say lc $big;        # word "\L"
say lcfirst $big;   # wORD "\l"
say uc $small;      # WORD "\U"
say ucfirst $small; # Word "\u"

say "\u\l$big\E";

sprintf


say sprintf "%c", 9786;     # ☺ - utf8 символы
say sprintf "%s", "str";    # str - строка
say sprintf "%d", 49;       # 49 - число
say sprintf "%u", -1;       # 18446744073709551615 - TODO: непонятно
say sprintf "%o", 101;      # 145 - 8-ричное число
say sprintf "%x", 57005;    # dead - 16-ричное число
say sprintf "%e", 1/3;      # 3.333333e-01 - вывод дробного числа с экспонентой
say sprintf "%f", 1/5;      # 0.200000
say sprintf "%g", .333333e-01; # 0.0333333

Функции

обьявление

Именнованные функции


sub mysub {
    my ($a, $b ) = @_;
    my $r = $a + $b;
    return $r;
}

Безымянные функции


my $var = sub {
    my $a = shift;
    return $a * 2;
}

вызов


say mysub( 1, 2 );
say mysub 5, 9;
say $var->(5);
=head
3
14
10

Модули

Пример модуля


use MP3::Tag;
my $mp3 = MP3::Tag->new( $ARGV[0] );
print $mp3->artist . " - " . $mp3->title . "\n";
=head
perl simple.pl 1.mp3 
Tech N9ne - Worldwide Choppers

use Data::Dumper;
my $foo = [{a => 1, b => 2}, { c => 3, d => 4}];
print Dumper $foo;
=head
$VAR1 = [
          {
            'b' => 2,
            'a' => 1
          },
          {
            'd' => 4,
            'c' => 3
          }
        ];

use DDP;
my $foo = [{a => 1, b => 2}, { c => 3, d => 4}];
say p $foo;
=head
\ [
    [0] {
        a   1,
        b   2
    },
    [1] {
        c   3,
        d   4
    }
]
ARRAY(0x9aaa48)