--- name: perl category: language language: perl filename: learnperl-bg.pl contributors: - ["Korjavin Ivan", "http://github.com/korjavin"] - ["Dan Book", "http://github.com/Grinnz"] translators: - ["Красимир Беров", "https://github.com/kberov"] lang: bg-bg --- Perl е изключително мощен език за програмиране с широка област на приложение и над 25 годишна история. Perl работи на повече от 100 операционни системи от мини до супер-компютри и е подходящ както за бърза разработка на скриптове така и за огромни приложения. ```perl # Едноредовите коментари започват със знака диез. #### Стриктен режим и предупреждения use strict; use warnings; # Силно препоръчително е всички скриптове и модули да включват тези редове. # strict спира компилацията в случай на необявени предварително променливи. # warnings показва предупредителни съобщения в случай на често допускани грешки, # например използване на променливи без стойност в низове. #### Типове променливи в Perl # Променливите започват със съответен знак (sigil - от латински sigillum ), # който представлява символ, указващ типа на променливата. Името на самата # променлива започва с буква или знак за подчертаване (_), следван от какъвто и # да е брой букви, цифри или знаци за подчертаване. Забележете, че ако напишете # 'use utf8;' (без кавичките), можете да използвате всякакви букви за имена на # променливите, включително и български. ### Perl има три главни типа променливи: $scalar (скалар), @array (масив), and %hash (хеш). ## Скалари # Скаларът представлява единична стойност: my $animal = "camel"; my $answer = 42; use utf8; my $животно = 'камила'; # Стойностите на скаларите могат да бъдат низове, цели числа или числа с # плаваща запетая (десетични дроби). Perl автоматично ги ползва и превръща от # един тип стойност в друга, според както е необходимо. ## Масиви # Масивът представлява списък от стойности: my @animals = ("камила", "llama", "owl"); my @numbers = (23, 42, 69); my @mixed = ("camel", 42, 1.23); # Елементите на масива се достъпват като се използват квадратни скоби и $, # който указва каква стойност ще бъде върната (скалар). my $second = $animals[1]; ## Хешове # Хешът представлява набор от двойки ключ/стойност: my %fruit_color = ("ябълка", "червена", "banana", "yellow"); # Може да използвате празно пространство и оператора "=>" (тлъста запетая), # за да ги изложите по-прегледно: %fruit_color = ( ябълка => "червена", banana => "yellow", ); # Елементите (стойностите) от хеша се достъпват чрез използване на ключовете. # Ключовете се ограждат с фигурни скоби и се поставя $ пред името на хеша. my $color = $fruit_color{ябълка}; # Скаларите, масивите и хешовете са документирани по-пълно в perldata. # На командния ред напишете (без кавичките) 'perldoc perldata'. #### Указатели (Референции) # По-сложни типове данни могат да бъдат създавани чрез използване на указатели, # които ви позволяват да изграждате масиви и хешове в други масиви и хешове. my $array_ref = \@array; my $hash_ref = \%hash; my @array_of_arrays = (\@array1, \@array2, \@array3); # Също така можете да създавате безименни масиви и хешове, към които сочат само # указатели. my $fruits = ["apple", "banana"]; my $colors = {apple => "red", banana => "yellow"}; # Можете да достигате до безименните структури като поставяте отпред съответния # знак на структурата, която искате да достъпите (дереферирате). my @fruits_array = @$fruits; my %colors_hash = %$colors; # Можете да използвате оператора стрелка (->), за да достигнете до отделна # скаларна стойност. my $first = $array_ref->[0]; my $value = $hash_ref->{banana}; # Вижте perlreftut и perlref, където ще намерите по-задълбочена документация за # указателите (референциите). #### Условни изрази и цикли # В Perl ще срещнете повечето от обичайните изрази за условия и обхождане (цикли). if ($var) { ... } elsif ($var eq 'bar') { ... } else { ... } unless (условие) { ... } # Това е друг, по-четим вариант на "if (!условие)" # Perl-овския начин след-условие print "Yow!" if $zippy; print "Нямаме банани" unless $bananas; # докато while (условие) { ... } # цикли for и повторение for (my $i = 0; $i < $max; $i++) { print "index is $i"; } for (my $i = 0; $i < @elements; $i++) { print "Current element is " . $elements[$i]; } for my $element (@elements) { print $element; } # мълчаливо - използва се подразбиращата се променлива $_. for (@elements) { print; } # Отново Perl-овския начин след- print for @elements; # отпечатване на стойностите чрез обхождане ключовете на указател към хеш print $hash_ref->{$_} for keys %$hash_ref; #### Регулярни (обикновени) изрази # Поддръжката на регулярни изрази е залеганала дълбоко в Perl. Задълбочена # документация ще намерите в perlrequick, perlretut и на други места. # Но ето накратко: # Просто съвпадение if (/foo/) { ... } # истина ако $_ съдържа "foo" if ($x =~ /foo/) { ... } # истина ако $x съдържа "foo" # Просто заместване $x =~ s/foo/bar/; # замества foo с bar в $x $x =~ s/foo/bar/g; # Замества ВСИЧКИ ПОЯВИ на foo с bar в $x #### Файлове и Вход/Изход (I/O) # Можете да отворите файл за въвеждане на данни в него или за извеждане на # данни от него като използвате функцията "open()". open(my $in, "<", "input.txt") or die "Не мога да отворя 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("Имаме подпрограма, която пише във файл-отчет!"); #### Модули # Модулът е набор от програмен код на Perl, обикновено подпрограми, който може # да бъде използван в друг програмен код на Perl. Обикновено се съхранява във # файл с разширение .pm, така че perl (програмата) да може лесно да го разпознае. # В MyModule.pm package MyModule; use strict; use warnings; sub trim { my $string = shift; $string =~ s/^\s+//; $string =~ s/\s+$//; return $string; } 1; # От другаде: use MyModule; MyModule::trim($string); # Чрез модула Exporter може да направите функциите си износни, така че други # програми да могат да ги внасят (импортират). # Такива функции се използват така: use MyModule 'trim'; trim($string); # Много Perl-модули могат да се свалят от CPAN (http://www.cpan.org/). Те # притежават редица полезни свойства, които ще ви помогнат да си свършите работа # без да откривате колелото. Голям брой известни модули като Exporter са включени # в дистрибуцията на самия Perl. Вижте perlmod за повече подробности, свързани с # модулите в Perl. #### Обекти # Обектите в Perl са просто референции, които знаят на кой клас (пакет) # принадлежат. По този начин методите (подпрограми), които се извикват срещу # тях могат да бъдат намерени в съответния клас. За да се случи това, в # конструкторите (обикновено new) се използва вградената функция # bless. Ако използвате обаче модули като Moose или Moo, няма да ви се налага # сами да извиквате bless (ще видите малко по-долу). package MyCounter; use strict; use warnings; sub new { my $class = shift; my $self = {count => 0}; return bless $self, $class; } sub count { my $self = shift; return $self->{count}; } sub increment { my $self = shift; $self->{count}++; } 1; # Методите могат да се извикват на клас или на обект като се използва оператора # стрелка (->). use MyCounter; my $counter = MyCounter->new; print $counter->count, "\n"; # 0 $counter->increment; print $counter->count, "\n"; # 1 # Модулите Moose и Moo от CPAN ви помагат леснот да създавате класове. Те # предоставят готов конструктор (new) и прост синтаксис за деклариране на # свойства на обектите (attributes). Този клас може да се използва по същия начин # като предишния по-горе. package MyCounter; use Moo; # внася strict и warnings has 'count' => (is => 'rwp', default => 0, init_arg => undef); sub increment { my $self = shift; $self->_set_count($self->count + 1); } 1; # Обектно-ориентираното програмиране е разгледано по-задълбочено в perlootut, # а изпълнението му на ниско ниво в Perl е обяснено в perlobj. ``` #### Често задавани въпроси (FAQ) # perlfaq съдържа въпроси и отговори, отнасящи се до много общи задачи и предлага # за ползване добри модлули от CPAN, подходящи за решаване на различни проблеми. #### Повече за четене - [Въведение в Perl](http://www.slideshare.net/kberov/01-intro-bg) - [PERL - Курс на МГУ "Св.Иван Рилски" (13 ЧАСТИ)](http://www.mgu.bg/drugi/ebooks/belchevski/perl.html) - [perl-tutorial](http://perl-tutorial.org/) - [Learn at www.perl.com](http://www.perl.org/learn.html) - [perldoc](http://perldoc.perl.org/) - и идващото с perl: `perldoc perlintro`