Синтаксис языка
Простые конструкции
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)