Направо към съдържанието

Пърл (език за програмиране): Разлика между версии

от Уикипедия, свободната енциклопедия
Изтрито е съдържание Добавено е съдържание
м й--->ѝ
- повторение
Ред 19: Ред 19:


'''Perl''' (произнася се „пърл“) е универсален, [[Интерпретативен език за програмиране|интерпретативен]] [[език за програмиране]], създаден от [[Лари Уол]] през 1987 г. Лари е трябвало да създава отчети за системата, която е поддържал тогава, но не е съществувал подходящ инструмент за целта (програмата [[awk]] не е можела да отваря и затваря файлове въз основа на информацията в тях), което го подтиква да създаде свой специализиран инструмент, който по-късно разпространява безплатно.
'''Perl''' (произнася се „пърл“) е универсален, [[Интерпретативен език за програмиране|интерпретативен]] [[език за програмиране]], създаден от [[Лари Уол]] през 1987 г. Лари е трябвало да създава отчети за системата, която е поддържал тогава, но не е съществувал подходящ инструмент за целта (програмата [[awk]] не е можела да отваря и затваря файлове въз основа на информацията в тях), което го подтиква да създаде свой специализиран инструмент, който по-късно разпространява безплатно.



== Име ==
== Име ==

Първоначално името на езика е било '''Pearl''' (произнася се по същия начин – „пърл“). Още преди да излезе първата версия на езика, Лари установява, че съществува език за програмиране на име [[PEARL]]. С цел да се избегнат конфликти, а и повлиян от характерната за [[философията на Unix]] тенденция към кратки имена, Лари променя името на езика на ''Perl'', без да променя произношението му.
Първоначално името на езика е било '''Pearl''' (произнася се по същия начин – „пърл“). Още преди да излезе първата версия на езика, Лари установява, че съществува език за програмиране на име [[PEARL]]. С цел да се избегнат конфликти, а и повлиян от характерната за [[философията на Unix]] тенденция към кратки имена, Лари променя името на езика на ''Perl'', без да променя произношението му.


Ред 28: Ред 26:


Съществува също така тънка разлика в значението в зависимост от това дали името е изписано с главна буква в началото или изцяло с малки букви. ''Perl'' е името на езика за програмиране, което, както (почти) всяко друго име, се пише с главна буква. Под ''perl'' се има предвид интерпретатора на езика Perl, т.е. програмата, която се стартира, за да се изпълни даден код на Perl. Името на интерпретатора спазва неписаното правило имената на команди под [[Юникс]] да са изцяло с малки букви.
Съществува също така тънка разлика в значението в зависимост от това дали името е изписано с главна буква в началото или изцяло с малки букви. ''Perl'' е името на езика за програмиране, което, както (почти) всяко друго име, се пише с главна буква. Под ''perl'' се има предвид интерпретатора на езика Perl, т.е. програмата, която се стартира, за да се изпълни даден код на Perl. Името на интерпретатора спазва неписаното правило имената на команди под [[Юникс]] да са изцяло с малки букви.



== Основни характеристики на Perl ==
== Основни характеристики на Perl ==
В Perl са заимствани концепции от доста езици – [[C (език за програмиране)|C]], [[awk]], [[sed]], [[Lisp]] и др. Най-силните му черти са регулярните изрази ([[английски език|англ]]. ''regular expression'', често съкращавано на ''regex''), вградените сложни [[структури от данни]] (обикновени и асоциативни масиви) и един от най-големите в света набори от свободно достъпни модули [http://cpan.org/ CPAN]. На Perl може да се пише [[процедурно програмиране|процедурно]], [[обектно-ориентирано програмиране|обектно-ориентирано]] и [[функционално програмиране|функционално]] (поддържа [[Затваряне (информатика)|затваряния]], познати още като обвивки, една от най-мощните абстракции в компютърната наука). Perl е [[слабо типизиран език]]. Той е интерпретиран, като програмата първо се компилира до машиннонезависими инструкции ([[байткод]]), които се изпълняват от интерпретатора. За разлика от [[Java]] обаче байткодът не е лесно достъпен, благодарение на което са избегнати редица проблеми с обратната съвместимост. Интерпретаторът на Perl е написан на C и е преносим на огромен брой платформи и [[операционна система|операционни системи]]. Програмата [http://www.indigostar.com/perl2exe.htm perl2exe ] и модулът [http://search.cpan.org/~autrijus/PAR-0.85_01/script/pp pp] могат да бъдат използвани за произвеждане (генериране) на изпълними програми от скриптове на Perl.

В Perl са заимствани концепции от доста езици – [[C (език за програмиране)|C]], [[awk]], [[sed]], [[Lisp]] и др. Най-силните му черти са регулярните изрази ([[английски език|англ]]. ''regular expression'', често съкращавано на ''regex''), вградените сложни [[структури от данни]] (обикновени и асоциативни масиви) и един от най-големите в света набори от свободно достъпни модули [http://cpan.org/ CPAN]. На Perl може да се пише [[процедурно програмиране|процедурно]], [[обектно-ориентирано програмиране|обектно-ориентирано]] и [[функционално програмиране|функционално]] (поддържа [[Затваряне (информатика)|затваряния]], познати още като обвивки, една от най-мощните абстракции в компютърната наука). Perl е [[слабо типизиран език]]. Той е интерпретиран, като програмата първо се компилира до машиннонезависими инструкции ([[байткод]]), които се изпълняват от интерпретатора. За разлика от [[Java]] обаче, байткодът не е лесно достъпен, благодарение на което са избегнати редица проблеми с обратната съвместимост. Интерпретаторът на Perl e написан на C и е преносим на огромен брой платформи и [[операционна система|операционни системи]]. Програмата [http://www.indigostar.com/perl2exe.htm perl2exe ] и модулът [http://search.cpan.org/~autrijus/PAR-0.85_01/script/pp pp] могат да бъдат използвани за произвеждане (генериране) на изпълними програми от скриптове на Perl.



== Предимства на езика ==
== Предимства на езика ==

=== Общността CPAN ===
=== Общността CPAN ===
CPAN (англ. ''Comprehensive Perl Archive Network'', в превод ''Изчерпателна мрежа от архиви на Perl'') представлява огромна колекция от софтуер написан изцяло или отчасти на Perl. Основната градивна единица на този софтуер е модулът. Съществуват незадължителни, но препоръчителни (и често спазвани на практика) указания за писането на модули за Perl, с необходимата им документация, която често с простотата и стандартността си превъзхожда документацията на много комерсиални продукти.
CPAN (англ. ''Comprehensive Perl Archive Network'', в превод ''Изчерпателна мрежа от архиви на Perl'') представлява огромна колекция от софтуер написан изцяло или отчасти на Perl. Основната градивна единица на този софтуер е модулът. Съществуват незадължителни, но препоръчителни (и често спазвани на практика) указания за писането на модули за Perl, с необходимата им документация, която често с простотата и стандартността си превъзхожда документацията на много комерсиални продукти.
Разработчиците на Perl създават програмни модули, разрешаващи разнообразни проблеми за почти всички [[операционна система|операционни системи]] и дори програмни езици. Тези модули обикновено са достъпни за използване под същия лиценз, както и самия Perl (т. нар. [[Artistic License]]), което допринася за по-нататъшното разрастване на общността. Всички тези модули могат да бъдат разгледани и свалени от [https://www.metacpan.org/ metacpan.org].
Разработчиците на Perl създават програмни модули, разрешаващи разнообразни проблеми за почти всички [[операционна система|операционни системи]] и дори програмни езици. Тези модули обикновено са достъпни за използване под същия лиценз, както и самия Perl (т.нар. [[Artistic License]]), което допринася за по-нататъшното разрастване на общността. Всички тези модули могат да бъдат разгледани и свалени от [https://www.metacpan.org/ metacpan.org].


=== Обработка на текст ===
=== Обработка на текст ===
Ред 50: Ред 44:


=== Използване на командния интерпретатор ===
=== Използване на командния интерпретатор ===
Името на главният [[изпълним файл]] (т.е. [[интерпретатор]]а на езика, който превръща текстовия код на Perl в изпълними инструкции за [[процесор]]а) е същото като името на програмния език, но обикновено се пише с малка буква – perl в *nix системи или perl.exe в Уиндоус системи.
Името на главния [[изпълним файл]] (т.е. [[интерпретатор]]а на езика, който превръща текстовия код на Perl в изпълними инструкции за [[процесор]]а) е същото като името на програмния език, но обикновено се пише с малка буква – perl в *nix системи или perl.exe в Уиндоус системи.
Този изпълним файл може да се използва за бързи изпълнения от командния ред на кратки програми наречени one-liners, който биха отнели много редове (и вероятно време) ако биха били написани на други програмни езици.
Този изпълним файл може да се използва за бързи изпълнения от командния ред на кратки програми наречени ''one-liners'', които биха отнели много редове (и вероятно време), ако биха били написани на други програмни езици.


Изпълнение на Perl програма съхранена във файл с име '''my_program.pl'''
Изпълнение на Perl програма съхранена във файл с име '''my_program.pl'''
Ред 57: Ред 51:
или само '''./my_program.pl''', ако файлът е изпълним ('''chmod +x my_program.pl''') и започва с директивата '''#!/usr/bin/perl''', или подобна, т.е оказваща пътя до perl (само под '''*nix''').
или само '''./my_program.pl''', ако файлът е изпълним ('''chmod +x my_program.pl''') и започва с директивата '''#!/usr/bin/perl''', или подобна, т.е оказваща пътя до perl (само под '''*nix''').


едноредови изрази (от англ. one-liners):

# Стартира дебъгера на Perl за „празната програма“, който може да бъде използван като shell / REPL (read-evaluate-print loop)
едно-редови изрази (от англ. one-liners):
# Стартира дебъгера на Perl за "празната програма", който може да бъде използван като shell / REPL (read-evaluate-print loop)
perl -de0
perl -de0


Ред 81: Ред 74:


== Недостатъци на езика ==
== Недостатъци на езика ==
Противниците на Perl твърдят, че той има много неясен и дори откровено грозен [[синтаксис]], дължащ се на редицата синтактични съкращения, целящи пестене на време при писане на едноредови команди (one-liners), и вградените оператори за работа с [[Регулярен израз|регулярни изрази]], които значително улесняват работата със символни низове, за сметка на загадъчният си запис. Мотото на езика „Има повече от един начин да го направиш“ („There Is More Than One Way To Do It.“, съкратено TIMTOWTDI), е друг аргумент на противниците на Perl, както и слабата типизация (която всъщност е една от силните страни на Perl).


Използването на основен набор от правила и конвенции при писането на код, като например тези използвани в документацията на Perl, лесно неутрализират всички синтактични особености.
Противниците на Perl твърдят, че той има много неясен и дори откровенно грозен [[синтаксис]], дължащ се на редицата синтактични съкращения, целящи пестене на време при писане на едноредови команди (one-liners), и вградените оператори за работа с [[Регулярен израз|регулярни изрази]], които значително улесняват работата със символни низове, за сметка на загадъчният си запис. Мотото на езика „Има повече от един начин да го направиш“ („There Is More Than One Way To Do It.“, съкратено TIMTOWTDI), е друг аргумент на противниците на Perl, както и слабата типизация (която всъщност е една от силните страни на Perl).

Използването на основен набор от правила и конвенции при писането на код, като например тeзи използвани в документацията на Perl, лесно неутрализират всички синтактични особици.


== Здравей, свят! ==
== Здравей, свят! ==

Програмата извеждаща „Здравей, свят!“, реализирана на Perl:
Програмата извеждаща „Здравей, свят!“, реализирана на Perl:
<source lang="perl">
<source lang="perl">
print "Здравей, свят!\n";
print „Здравей, свят!\n“;
</source>
</source>



== Вградени типове данни ==
== Вградени типове данни ==
Вградените типове данни на Perl се обозначават с помощта на сиджил (символ, използван като представка, т.е. преди името на променливата), който също така представлява и минималистична [[унгарска нотация]]:

* '''Скалар''' – използва сиджил <nowiki>'</nowiki>''', представлява единична стойност, която може да бъде число, символен низ или препратка (или още референция от англ. ''reference'')
Вградените типове данни на Perl се обозначават с помощта на сиджил (символ използван като представка, т.е преди името на променливата), който също така представлява и минималистична [[унгарска нотация]]:
* '''Скалар''' – използва сиджил <nowiki>'</nowiki>'''$'''<nowiki>'</nowiki>, представлява единична стойност, която може да бъде число, символен низ или препратка (или още референция от англ. ''reference'')


* '''Масив''' – използва сиджил <nowiki>'</nowiki>'''@'''<nowiki>'</nowiki>, представлява списък от скалари, означавани (т.е. номерирани) последователно, като масивите в Perl са 0-базирани, но това може да бъде променяно, но е силно непрепоръчително. Поредният номер на даден елемент от масива се нарича ''индекс''. Достъпът до отделни елементи от масива използва подобен на езика [[C (език за програмиране)|C]] синтаксис: '''$<'''име_на_масив'''>[<'''индекс>''']'''.
* '''Масив''' – използва сиджил <nowiki>'</nowiki>'''@'''<nowiki>'</nowiki>, представлява списък от скалари, означавани (т.е. номерирани) последователно, като масивите в Perl са 0-базирани, но това може да бъде променяно, но е силно непрепоръчително. Поредният номер на даден елемент от масива се нарича ''индекс''. Достъпът до отделни елементи от масива използва подобен на езика [[C (език за програмиране)|C]] синтаксис: '''$<'''име_на_масив'''>[<'''индекс>''']'''.
Ред 108: Ред 97:


* '''Typeglob''' – използва сиджил <nowiki>'</nowiki>'''*'''<nowiki>'</nowiki> и представлява тип данни, който предоставя достъп до символните таблици в езика Perl.
* '''Typeglob''' – използва сиджил <nowiki>'</nowiki>'''*'''<nowiki>'</nowiki> и представлява тип данни, който предоставя достъп до символните таблици в езика Perl.



Кратки примери:
Кратки примери:
Ред 114: Ред 102:
# При декларирането на променливи в езика Perl се използва ключовата дума 'my'
# При декларирането на променливи в езика Perl се използва ключовата дума 'my'
# подобно на ключовата дума 'var', срещаща се в други езици.
# подобно на ключовата дума 'var', срещаща се в други езици.



# Деклариране на скаларни променливи.
# Деклариране на скаларни променливи.
Ред 120: Ред 107:
my $name = "Янко";
my $name = "Янко";
my $number = 9;
my $number = 9;
print "$name #$number\n";
print $name #$number\n“;


# извежда: Янко #9
# извежда: Янко #9



# Деклариране на масив.
# Деклариране на масив.
#
#
my @names = ("Иван", "Петър", "Георги");
my @names = („Иван“, „Петър“, „Георги“);
print "$names[0], $names[2] и $names[1]\n";
print $names[0], $names[2] и $names[1]\n“;


# oтпечатва: Иван, Георги и Петър
# oтпечатва: Иван, Георги и Петър



# Деклариране на хеш.
# Деклариране на хеш.
Ред 141: Ред 126:
);
);


print "Име: $hash{'name'}\nФамилия: $hash{'surname'}\nМестожителство: $hash{city}\n";
print „Име: $hash{'name'}\nФамилия: $hash{'surname'}\nМестожителство: $hash{city}\n“;


# извежда:
# извежда:
Ред 147: Ред 132:
# Фамилия: Георгиев
# Фамилия: Георгиев
# Местожителство: София
# Местожителство: София



# Отваряне на файл за четене.
# Отваряне на файл за четене.
Ред 154: Ред 138:
my @line = <$file>; # Всеки ред на файла се записва като отделен елемент на масива.
my @line = <$file>; # Всеки ред на файла се записва като отделен елемент на масива.
close $file;
close $file;



# Деклариране на функция / подпрограма.
# Деклариране на функция / подпрограма.
Ред 167: Ред 150:
# Скобите са незадължителни при извикването на функции, стига
# Скобите са незадължителни при извикването на функции, стига
# нейната дефиниция да е преди употребата ѝ, но неизползването на скобите
# нейната дефиниция да е преди употребата ѝ, но неизползването на скобите
# e добре да бъде прилагано само за вградените функции.
# е добре да бъде прилагано само за вградените функции.
#
#
count_to 4;
count_to 4;
Ред 178: Ред 161:


# Отпечатва абсолютно същото, но е препоръчително
# Отпечатва абсолютно същото, но е препоръчително
# сиджила за функции, да бъде използван само, когато е нужна
# сиджилът за функции, да бъде използван само, когато е нужна
# рефенреция към функция.
# референция към функция.
&count_to(4);
&count_to(4);



# Съхранява референция към функция в скалар.
# Съхранява референция към функция в скалар.
my $count_to_ref = \&count_to;
my $count_to_ref = \&count_to;


# Извикването на тази референция става, като първо диреференцираме, или използваме записа с ->.
# Извикването на тази референция става, като първо диференцираме или използваме записа с ->.
&$count_to_ref(10);
&$count_to_ref(10);
$count_to_ref->(10);
$count_to_ref->(10);


# Когато се използват затваряния (closure), се използват тъкмо референции към аниномни функции
# Когато се използват затваряния (closure), се използват тъкмо референции към анонимни функции
#
#
my $pow_generator = sub {
my $pow_generator = sub {
Ред 202: Ред 184:


my $pow3 = $pow_generator->(3);
my $pow3 = $pow_generator->(3);
print $pow3->(2), "\n"; # извежда: 8 = 2^3
print $pow3->(2), \n“; # извежда: 8 = 2^3
</source>
</source>



== Основни контролни структури ==
== Основни контролни структури ==

Контролните структури в Perl могат да се записват по два начина. При първият кодът, който ще се изпълнява, е разположен на произволен брой редове, при другия – само на един.
Контролните структури в Perl могат да се записват по два начина. При първият кодът, който ще се изпълнява, е разположен на произволен брой редове, при другия – само на един.
За разлика от езика [[C (език за програмиране)|C]], в Perl е задължителна употребата на фигурни скоби за структурите използващи един единствен оператор.
За разлика от езика [[C (език за програмиране)|C]], в Perl е задължителна употребата на фигурни скоби за структурите използващи един единствен оператор.


=== Условни структури ===
=== Условни структури ===

==== if ====
==== if ====
Кода се изпълнява само ако условието се изпълни:
Кодът се изпълнява само ако условието се изпълни:


<source lang='perl'>
<source lang='perl'>
my $today = "понеделник";
my $today = "понеделник";


if ($today eq "понеделник") {
if ($today eq „понеделник“) {
print "Днес е понеделник!\n";
print "Днес е понеделник!\n";
}
}
Ред 229: Ред 208:
<source lang='perl'>
<source lang='perl'>
my $today = "понеделник";
my $today = "понеделник";
print "Днес е понеделник!\n" if $today eq "понеделник"; # Скобите на структурите от този вид са незадължителни.
print „Днес е понеделник!\n“ if $today eq „понеделник“; # Скобите на структурите от този вид са незадължителни.
</source>
</source>


Ред 235: Ред 214:
<source lang='perl'>
<source lang='perl'>
my $today = "сряда";
my $today = "сряда";
if ($today eq "понеделник") {
if ($today eq „понеделник“) {
print "Днес е понеделник!\n";
print "Днес е понеделник!\n";
} elsif ($today eq "вторник") {
} elsif ($today eq „вторник“) {
print "Днес е вторник!\n";
print "Днес е вторник!\n";
} elsif ($today eq "сряда!") {
} elsif ($today eq „сряда!) {
print "Днес е сряда!\n";
print "Днес е сряда!\n";
} elsif ($today eq "четвъртък") {
} elsif ($today eq „четвъртък“) {
print "Днес е четвъртък!\n";
print "Днес е четвъртък!\n";
} elsif ($today eq "петък") {
} elsif ($today eq „петък“) {
print "Днес е петък!\n";
print "Днес е петък!\n";
} else {
} else {
Ред 253: Ред 232:


==== unless ====
==== unless ====
'''unless''' е обратната на '''if''', и еквивалентна на '''if not'''. Кода се изпълнява когато условието пропадне.
'''unless''' е обратната на '''if''' и еквивалентна на '''if not'''. Кодът се изпълнява, когато условието пропадне.
<source lang='perl'>
<source lang='perl'>
my $today = "понеделник";
my $today = "понеделник";
print "Днес е делник!" if not $today eq "събота" || $today eq "неделя";
print „Днес е делник! if not $today eq „събота“ || $today eq „неделя“;
# извежда: Днес е делник!
# извежда: Днес е делник!
</source>
</source>



=== Циклични структури ===
=== Циклични структури ===
Ред 265: Ред 243:


==== while ====
==== while ====
При '''while''' кодът се изпълнява докато условието не се провали.
При '''while''' кодът се изпълнява, докато условието не се провали.
<source lang='perl'>
<source lang='perl'>
my $i = 0;
my $i = 0;
while ($i <= 9) {
while ($i <= 9) {
�35�
print "$i\n";
�36�
$i = $i + 1; # може да се запише съкратено $i++;
}
}
</source>
</source>
Ред 279: Ред 257:
for (my $i = 0; $i <= 9; $i++)
for (my $i = 0; $i <= 9; $i++)
{
{
�37�
print "$i\n";
}
}
</source>
</source>
Ред 288: Ред 266:
foreach my $i (0 .. 9) # бинарният оператор '..' връща масив с елементите от интервалa [$a, $b], записан като $a .. $b
foreach my $i (0 .. 9) # бинарният оператор '..' връща масив с елементите от интервалa [$a, $b], записан като $a .. $b
{
{
print "$i\n";
print "$i\n";
}
}
</source>
</source>



За прекъсване на цикъл или итерация (изпълнение) се използват:
За прекъсване на цикъл или итерация (изпълнение) се използват:
Ред 301: Ред 278:


while ($counted_to <= $count_to) {
while ($counted_to <= $count_to) {
�39�
$counted_to++;
�40�
next if $counted_to == 3;
�41�
print "$counted_to ";
�42�
last if $counted_to == 5;
}
}
</source>
</source>
Тази програма трябва да брои от 1 до 10 според условието в '''while''', но числото 3 не се извежда, защото при всяка итерация се прави проверка дали '''$counted_to''' не е 3, ако е, се пропуска. Също така цикъла няма да стигне никога до 10, защото когато стигне 5, ще се изпълни '''last''' и цикъла ще прекъсне.
Тази програма трябва да брои от 1 до 10 според условието в '''while''', но числото 3 не се извежда, защото при всяка итерация се прави проверка дали '''$counted_to''' не е 3, ако е се пропуска. Също така цикълът няма да стигне никога до 10, защото когато стигне 5, ще се изпълни '''last''' и цикълът ще прекъсне.


Цикличните структури в Perl превъзхождат тези в езика C, тъй като те могат да бъдат „именувани“ с етикети и позволяват излизане от дълбоко вмъкнати един в друг цикли:

Цикличните структури в Perl, са превъзхождат тези в езика C, тъй като те могат да бъдат "именувани" с етикети и позволяват излизане от дълбоко вмъкнати един в друг циккли:
<source lang='perl'>
<source lang='perl'>
my $i = 0;
my $i = 0;
Ред 316: Ред 292:
while ($i < 10)
while ($i < 10)
{
{
�43�
�44�
�45�
�46�
�47�
�48�
�49�
�50�
�51�
�52�
�53�

�54�
�55�
�56�
}
</source>

== Поeзия в Perl ==
На Perl можe даже да се пишат стихотворения. Едно такова стихотворение с название „Black Perl“ („Черен бисер/перла/“) е било цитирано от Лари Уол в първоаприлско писмо в [[Usenet]]. То било написано поначало на Perl 3 и по думите на самия Лари той изпитал морално удовлетворение, когато стихотворението не извадило грешки в синтактически анализатор на Perl 5. Лари е известен и с миролюбивостта си, и протеста срещу милитаристичната политика на големите държави.

<source lang="perl">
$i = $i + 1; # може да се запише съкратено $i++;
print "$i\n";
print "$i\n";
$counted_to++;
next if $counted_to == 3;
print "$counted_to ";
last if $counted_to == 5;
print "\$i = $i\n";
print "\$i = $i\n";
MIDDLE:
MIDDLE:
Ред 327: Ред 332:
next MIDDLE if $i == 6;
next MIDDLE if $i == 6;
}
}

last OUTER if $j == 2;
last OUTER if $j == 2;
}
}
$i++;
}
</source>
</source>


== Поeзия в Perl ==

На Perl можe даже да се пишат стихотворения. Едно такова стихотворение с название „Black Perl“ („Черен бисер/перла/“) е било цитирано от Лари Уол в първо априлско писмо в [[Usenet]]. То било написано поначало на Perl 3, и по думите на самия Лари, той изпитал морално удовлетворение, когато стихотворението не извадило грешки в синтактически анализатор на Perl 5. Лари е известен и с миролюбовта си, и протеста срещу милитаристичната политика на големите държави.

<source lang="perl">
BEFOREHEAD: close door, each window & exit; wait until time.
open spellbook, study, read (scan, select, tell us);
write it, print the hex whole each watches,
reverse its length, write again;
kill spiders, pop them, chop, split, kill them.
unlink arms, shift, wait & listen (listening, wait),
sort the flock (then, warn the "goats" & kill the "sheep");
kill them, dump qualms, shift moralities,
values aside, each one;
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice,
wait, redo ritual until "all the spirits are pleased";
do it ("as they say").
do it(*everyone***must***participate***in***forbidden**s*e*x*).
return last victim; package body;
exit crypt (time, times & "half a time") & close it,
select (quickly) & warn your next victim;
AFTERWORDS: tell nobody,
</source>



== Инсталация ==
== Инсталация ==
Perl е част от всяка Юникс или [[Юникс-подобна операционна система|Юникс-подобна]] система. Това може да бъде проверено с изпълнението на командата perl -v в шела. За Уиндоус програмната среда може да бъде безплатно свалена от [http://www.activestate.com/Products/activeperl/index.plex сайта на ActiveState] или [http://strawberryperl.com/ сайта на Strawberry Perl] - дистрибуция съдържаща dmake, която улеснява инсталацият на модули изискващи make под [[Unix]]. Всяка стандартна инсталация на програмната среда може да бъде допълвана с най-различни модули от [http://www.cpan.org сайта на CPAN], голяма част от които функционират на различни операционни системи.
Perl е част от всяка Юникс или [[Юникс-подобна операционна система|Юникс-подобна]] система. Това може да бъде проверено с изпълнението на командата perl -v в шела. За Уиндоус програмната среда може да бъде безплатно свалена от [http://www.activestate.com/Products/activeperl/index.plex сайта на ActiveState] или [http://strawberryperl.com/ сайта на Strawberry Perl] дистрибуция съдържаща dmake, която улеснява инсталацият на модули, изискващи make под [[Unix]]. Всяка стандартна инсталация на програмната среда може да бъде допълвана с най-различни модули от [http://www.cpan.org сайта на CPAN], голяма част от които функционират на различни операционни системи.



== Документация ==
== Документация ==
Документацията на Perl изобилства от шеги и игри на думи, за разлика от сухия език на повечето компютърна литература, а годишните обръщения на Лари („State of the Onion“, каламбур с обръщението на президента на САЩ, „State of the Union“) са ненадминати образци на духовитост.
Документацията на Perl изобилства от шеги и игри на думи, за разлика от сухия език на повечето компютърна литература, а годишните обръщения на Лари („State of the Onion“, каламбур с обръщението на президента на САЩ, „State of the Union“) са ненадминати образци на духовитост.


Въпреки шеговитият си характер, документацията на езика е изключително пълна и най-важното общодостъпна. С командата ''perldoc <име на модул>'' се извежда помощта за съответния модул. [http://perldoc.perl.org/perl.html Онлайн документацията] изобилства с примери и указания дори и за начинаещи в езика.
Въпреки шеговития си характер, документацията на езика е изключително пълна и най-важното общодостъпна. С командата ''perldoc <име на модул>'' се извежда помощта за съответния модул. [http://perldoc.perl.org/perl.html Онлайн документацията] изобилства с примери и указания дори и за начинаещи в езика.



== Литература ==
== Литература ==

Най-популярната книга за Perl е написана от автора му и е известна сред феновете на езика като „камилата“ заради картинката на обложката си.
Най-популярната книга за Perl е написана от автора му и е известна сред феновете на езика като „камилата“ заради картинката на обложката си.
* {{cite book |last= Уол |first= Лари |authorlink= |coauthors= Том Кристиансен, Йон Орвант |title= Програмиране с Perl |year= 2002 |publisher= ЗеСТ Прес |location= |isbn= 978-954-90498-8-6 }}
* {{cite book |last= Уол |first= Лари |authorlink= |coauthors= Том Кристиансен, Йон Орвант |title= Програмиране с Perl |year= 2002 |publisher= ЗеСТ Прес |location= |isbn= 978-954-90498-8-6 }}
Ред 380: Ред 350:
* {{cite book |last= Кристиансен |first= Том |authorlink= |coauthors= Нейтън Торкингтън |title= Perl Cookbook |year= 2005 |publisher= ЗеСТ Прес |location= |isbn= 978-954-93410-6-5 }}
* {{cite book |last= Кристиансен |first= Том |authorlink= |coauthors= Нейтън Торкингтън |title= Perl Cookbook |year= 2005 |publisher= ЗеСТ Прес |location= |isbn= 978-954-93410-6-5 }}
* {{cite book |last= Казънс |first= Саймън |authorlink= |coauthors= Питър Уейнрайт |title= Програмиране с Perl |year= 2001 |publisher= Софтпрес |location= |isbn= 978-954-685-138-3 }}
* {{cite book |last= Казънс |first= Саймън |authorlink= |coauthors= Питър Уейнрайт |title= Програмиране с Perl |year= 2001 |publisher= Софтпрес |location= |isbn= 978-954-685-138-3 }}



== Външни препратки ==
== Външни препратки ==

* [http://2009.perlbulgaria.org/ Perl-воркшоп 2009]
* [http://2009.perlbulgaria.org/ Perl-воркшоп 2009]

* [http://www.perl.com/ Официална страница на Perl]
* [http://www.perl.com/ Официална страница на Perl]
* [http://www.cpan.org/ CPAN] (Comprehensive Perl Archive Network, огромен архив с модули за Perl)
* [http://www.cpan.org/ CPAN] (Comprehensive Perl Archive Network, огромен архив с модули за Perl)

Версия от 07:02, 5 септември 2019

Вижте пояснителната страница за други значения на Пърл.

Perl
Парадигмафункционален, обектно-ориентиран, процедурен
Реализиране през1987
АвторЛари Уол
Типизация на даннитединамична
Повлиян отAWK, C, C++, Lisp, Pascal, Sed, Smalltalk 80, Unix shell
ПовлияваPython, PHP, Ruby, ECMAScript, LPC, Windows PowerShell, JavaScript, Falcon, Perl 6, Qore
ПлатформаCross-platform
Софтуерен лицензGPL or Artistic License
Уебсайтwww.perl.org
Perl в Общомедия

Perl (произнася се „пърл“) е универсален, интерпретативен език за програмиране, създаден от Лари Уол през 1987 г. Лари е трябвало да създава отчети за системата, която е поддържал тогава, но не е съществувал подходящ инструмент за целта (програмата awk не е можела да отваря и затваря файлове въз основа на информацията в тях), което го подтиква да създаде свой специализиран инструмент, който по-късно разпространява безплатно.

Име

Първоначално името на езика е било Pearl (произнася се по същия начин – „пърл“). Още преди да излезе първата версия на езика, Лари установява, че съществува език за програмиране на име PEARL. С цел да се избегнат конфликти, а и повлиян от характерната за философията на Unix тенденция към кратки имена, Лари променя името на езика на Perl, без да променя произношението му.

Впоследствие се появяват интерпретации на името като съкращение, най-популярната от които е Practical Extraction and Report Language (в превод: практичен език за извличане и отчети). Съществуват и много други интерпретации, включително и такива от самия Лари Уол, като например шеговитото Pathologically Eclectic Rubbish Lister (в превод: патологично многостранен изброител на глупости). Всички те обаче са бекроними. Името на езика не е съкращение от нищо, поради което се пише само с една главна буква – Perl, а не PERL (за разлика от споменатия език PEARL, чието име наистина е съкращение).

Съществува също така тънка разлика в значението в зависимост от това дали името е изписано с главна буква в началото или изцяло с малки букви. Perl е името на езика за програмиране, което, както (почти) всяко друго име, се пише с главна буква. Под perl се има предвид интерпретатора на езика Perl, т.е. програмата, която се стартира, за да се изпълни даден код на Perl. Името на интерпретатора спазва неписаното правило имената на команди под Юникс да са изцяло с малки букви.

Основни характеристики на Perl

В Perl са заимствани концепции от доста езици – C, awk, sed, Lisp и др. Най-силните му черти са регулярните изрази (англ. regular expression, често съкращавано на regex), вградените сложни структури от данни (обикновени и асоциативни масиви) и един от най-големите в света набори от свободно достъпни модули CPAN. На Perl може да се пише процедурно, обектно-ориентирано и функционално (поддържа затваряния, познати още като обвивки, една от най-мощните абстракции в компютърната наука). Perl е слабо типизиран език. Той е интерпретиран, като програмата първо се компилира до машиннонезависими инструкции (байткод), които се изпълняват от интерпретатора. За разлика от Java обаче байткодът не е лесно достъпен, благодарение на което са избегнати редица проблеми с обратната съвместимост. Интерпретаторът на Perl е написан на C и е преносим на огромен брой платформи и операционни системи. Програмата perl2exe и модулът pp могат да бъдат използвани за произвеждане (генериране) на изпълними програми от скриптове на Perl.

Предимства на езика

Общността CPAN

CPAN (англ. Comprehensive Perl Archive Network, в превод Изчерпателна мрежа от архиви на Perl) представлява огромна колекция от софтуер написан изцяло или отчасти на Perl. Основната градивна единица на този софтуер е модулът. Съществуват незадължителни, но препоръчителни (и често спазвани на практика) указания за писането на модули за Perl, с необходимата им документация, която често с простотата и стандартността си превъзхожда документацията на много комерсиални продукти. Разработчиците на Perl създават програмни модули, разрешаващи разнообразни проблеми за почти всички операционни системи и дори програмни езици. Тези модули обикновено са достъпни за използване под същия лиценз, както и самия Perl (т.нар. Artistic License), което допринася за по-нататъшното разрастване на общността. Всички тези модули могат да бъдат разгледани и свалени от metacpan.org.

Обработка на текст

Най-силната страна на Perl е обработката на текст. Това го прави изключително популярен сред системните администратори. Операции като отваряне, четене, синтактичен разбор (известен още като „парсване“), търсене, заместване на текстови файлове са кратки и лесни за програмиране, имплементирани са много ефективно и се изпълняват по-бързо отколкото в повечето други езици.

Динамични уеб страници

Разработчиците на динамични уеб страници (страниците, чиито съдържание се произвежда на момента на тяхното извикване – т.е. динамично) често използват Perl поради големия брой безплатни скриптове, както и общността на разработчици предлагащи помощ на своите колеги. Богатата библиотека с модули, споменатата мощна текстообработка, която често се налага при генерирането на HTML страници, както и фактът, че е слабо типизиран и интерпретиран език, правят възможна бързата разработка на приложения в много области, включително и настолни графични приложения.

Фактът, че Perl се интерпретира в момента на изпълнение, налага уеб сървърът да стартира на интерпретатора perl за всяка уеб страница, която трябва да се генерира. При по-натоварени сайтове това може да доведе до значително натоварване на системата, както откъм памет, така и откъм процесорно време. За да се избегне това, специално за Perl е създаден модула mod_perl за сървъра Apache, който на практика представлява интерпретатор за Perl, вграден в кода на Apache. Това позволява на уеб сървъра да изпълнява код на Perl, без да се налага да стартира нов процес за всяка заявена уеб страница. Това води до значително увеличение на производителността при намалени ресурси. Mod_perl отива дори още по-надалеч и дава на скриптовете на Perl достъп до всички „вътрешности“ на самия Apache сървър, като им позволява да се намесват във всеки един етап от доставянето на HTML страницата, както и да използват конструкции на Perl в конфигурационните файлове на Apache.

Използване на командния интерпретатор

Името на главния изпълним файл (т.е. интерпретатора на езика, който превръща текстовия код на Perl в изпълними инструкции за процесора) е същото като името на програмния език, но обикновено се пише с малка буква – perl в *nix системи или perl.exe в Уиндоус системи. Този изпълним файл може да се използва за бързи изпълнения от командния ред на кратки програми наречени one-liners, които биха отнели много редове (и вероятно време), ако биха били написани на други програмни езици.

Изпълнение на Perl програма съхранена във файл с име my_program.pl

perl ./my_program.pl

или само ./my_program.pl, ако файлът е изпълним (chmod +x my_program.pl) и започва с директивата #!/usr/bin/perl, или подобна, т.е оказваща пътя до perl (само под *nix).

едноредови изрази (от англ. one-liners):

# Стартира дебъгера на Perl за „празната програма“, който може да бъде използван като shell / REPL (read-evaluate-print loop)
perl -de0
# Отваря всички файлове от типа *.с и променя foo на bar.
perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c
# Извежда само първите 50 реда от файловете f1, f2, f3.
perl -pe 'exit if $. > 50' f1 f2 f3
# Изтрива първите 10 реда на файла foo.txt.
perl -i.old -ne 'print unless 1 .. 10' foo.txt
# Променя последователността на редовете във файловете f1, f2, f3.
perl -e 'print reverse <>' f1 f2 f3
# Променя последователността на абзаците във файловете f1, f2, f3.
perl -00 -e 'print reverse <>' f1 f2 f3
# Изтрива всички други редове освен тези между реда започващ със START и този започващ с END включително във файл foo.txt.
perl -i.old -ne 'print if /^START$/ .. /^END$/' foo.txt

Недостатъци на езика

Противниците на Perl твърдят, че той има много неясен и дори откровено грозен синтаксис, дължащ се на редицата синтактични съкращения, целящи пестене на време при писане на едноредови команди (one-liners), и вградените оператори за работа с регулярни изрази, които значително улесняват работата със символни низове, за сметка на загадъчният си запис. Мотото на езика „Има повече от един начин да го направиш“ („There Is More Than One Way To Do It.“, съкратено TIMTOWTDI), е друг аргумент на противниците на Perl, както и слабата типизация (която всъщност е една от силните страни на Perl).

Използването на основен набор от правила и конвенции при писането на код, като например тези използвани в документацията на Perl, лесно неутрализират всички синтактични особености.

Здравей, свят!

Програмата извеждаща „Здравей, свят!“, реализирана на Perl:

print Здравей, свят!\n;

Вградени типове данни

Вградените типове данни на Perl се обозначават с помощта на сиджил (символ, използван като представка, т.е. преди името на променливата), който също така представлява и минималистична унгарска нотация:

  • Скалар – използва сиджил ', представлява единична стойност, която може да бъде число, символен низ или препратка (или още референция от англ. reference)
  • Масив – използва сиджил '@', представлява списък от скалари, означавани (т.е. номерирани) последователно, като масивите в Perl са 0-базирани, но това може да бъде променяно, но е силно непрепоръчително. Поредният номер на даден елемент от масива се нарича индекс. Достъпът до отделни елементи от масива използва подобен на езика C синтаксис: $<име_на_масив>[<индекс>].
  • Хеш – използва сиджил '%', (наричан още хеш-таблица или асоциативен масив) е множество от подредени двойки скалари. Като двойките помежду си нямат подредба или номерация, т.е. образуват математическо множество. Елементите на една конкретна двойка обаче са подредени, т.е. има първи и втори: Първият се нарича ключ (на англ. key), а вторият стойност (на англ. value). И двата скалара могат да бъдат произволни и няма нужда да са от един и същи тип. Достъпът до отделни стойности от хеша става чрез ключовете. В известен смисъл ключовете при хеша съответстват на индексите при масива. В това отношение хешът може да се разглежда като по-обща форма на масив, при която индексите не са ограничени до числа, а могат да бъдат произволни скалари. Тъй като ключовете се използват за идентификация на стойностите в хеша, те трябва да са уникални, т.е. да няма повторения. За разлика от тях, стойностите могат да се повтарят – на различни ключове могат да съответстват едни и същи стойности. Достъпът до стойностите на хеша използва синтаксиса: $<име_на_хеш>{име_на_ключ}.
  • Файлов манипулатор – няма определен сиджил, наричан още файлов дескриптор (от англ. file descriptor или file handle), този тип променливи предоставя достъп до файл или друго поточно устройство, като например мрежова връзка, тръба (от англ. pipe), и т.н. Файловият дескриптор може да бъде отворен за писане, четене или и за двете.
  • Подпрограма – използва сиджил '&'. Подпрограмата (subroutine, позната още и като функция (на анлг. function) е последователност от инструкции, на които могат да се предават аргументи, извършващи някакво действие с тях, и/или пресмята резултат и накрая евентуално връща стойност (обикновено пресметнатия резултат или нищо, ако няма такъв).
  • Typeglob – използва сиджил '*' и представлява тип данни, който предоставя достъп до символните таблици в езика Perl.

Кратки примери:

# При декларирането на променливи в езика Perl се използва ключовата дума 'my'
# подобно на ключовата дума 'var', срещаща се в други езици.

# Деклариране на скаларни променливи.
#
my $name = "Янко";
my $number = 9;
print $name #$number\n“;

# извежда: Янко #9

# Деклариране на масив.
#
my @names = (Иван, Петър, Георги);
print $names[0], $names[2] и $names[1]\n;

# oтпечатва: Иван, Георги и Петър

# Деклариране на хеш.
#
my %hash = (
   'name'    => 'Иван',
   'surname' => 'Георгиев',
   'city'    => 'София',
);

print Име: $hash{'name'}\nФамилия: $hash{'surname'}\nМестожителство: $hash{city}\n;

# извежда:
# Име: Иван
# Фамилия: Георгиев
# Местожителство: София

# Отваряне на файл за четене.
#
open my $file, '<', '/home/georgi/file.txt';
my @line = <$file>; # Всеки ред на файла се записва като отделен елемент на масива.
close $file;

# Деклариране на функция / подпрограма.
#
sub count_to {
    my $n = $_[0]; # Аргументите се предават в специалния масив @_.
    for ($i = 1; $i <= $n; $i++) {
        print"Мога да броя до $i!\n";
    }
}

# Скобите са незадължителни при извикването на функции, стига
# нейната дефиниция да е преди употребата ѝ, но неизползването на скобите
# е добре да бъде прилагано само за вградените функции.
#
count_to 4;

# oтпечатва:
# Мога да броя до 1!
# Мога да броя до 2!
# Мога да броя до 3!
# Мога да броя до 4!

# Отпечатва абсолютно същото, но е препоръчително
# сиджилът за функции, да бъде използван само, когато е нужна
# референция към функция.
&count_to(4);

# Съхранява референция към функция в скалар.
my $count_to_ref = \&count_to;

# Извикването на тази референция става, като първо диференцираме или използваме записа с ->.
&$count_to_ref(10);
$count_to_ref->(10);

# Когато се използват затваряния (closure), се използват тъкмо референции към анонимни функции
#
my $pow_generator = sub {
    my $p = $_[0];

    return sub {
        my $b = $_[0];
        return $b ** $p; # b^p
    };
};

my $pow3 = $pow_generator->(3);
print $pow3->(2), \n; # извежда: 8 = 2^3

Основни контролни структури

Контролните структури в Perl могат да се записват по два начина. При първият кодът, който ще се изпълнява, е разположен на произволен брой редове, при другия – само на един. За разлика от езика C, в Perl е задължителна употребата на фигурни скоби за структурите използващи един единствен оператор.

Условни структури

if

Кодът се изпълнява само ако условието се изпълни:

my $today = "понеделник";

if ($today eq понеделник) {
   print "Днес е понеделник!\n";
}

# извежда: Днес е понеделник!

Едноредов вариант:

my $today = "понеделник";
print Днес е понеделник!\n if $today eq понеделник; # Скобите на структурите от този вид са незадължителни.

if-elsif-else

my $today = "сряда";
if ($today eq понеделник) {
   print "Днес е понеделник!\n";
} elsif ($today eq вторник) {
   print "Днес е вторник!\n";
} elsif ($today eq сряда!) {
   print "Днес е сряда!\n";
} elsif ($today eq четвъртък) {
   print "Днес е четвъртък!\n";
} elsif ($today eq петък) {
   print "Днес е петък!\n";
} else {
   print "Днес е почивен ден!\n";
}

# извежда: Днес е сряда!

unless

unless е обратната на if и еквивалентна на if not. Кодът се изпълнява, когато условието пропадне.

my $today = "понеделник";
print Днес е делник! if not $today eq събота || $today eq неделя;
# извежда: Днес е делник!

Циклични структури

Всички примери извеждат цифрите от 0 до 9.

while

При while кодът се изпълнява, докато условието не се провали.

my $i = 0;
while ($i <= 9) {
35
36
}

for

for цикъл в стил C, който рядко се използва в Perl

for (my $i = 0; $i <= 9; $i++)
{
37
}

foreach

Ключовата дума foreach, е синоним на for

foreach my $i (0 .. 9) # бинарният оператор '..' връща масив с елементите от интервалa [$a, $b], записан като $a .. $b
{
   print "$i\n";
}

За прекъсване на цикъл или итерация (изпълнение) се използват:

  • last – прекъсва изпълнението на цикъла
  • next – преминава на следващата итерация
my $count_to = 10;
my $counted_to = 0;

while ($counted_to <= $count_to) {
39
40
41
42
}

Тази програма трябва да брои от 1 до 10 според условието в while, но числото 3 не се извежда, защото при всяка итерация се прави проверка дали $counted_to не е 3, ако е – се пропуска. Също така цикълът няма да стигне никога до 10, защото когато стигне 5, ще се изпълни last и цикълът ще прекъсне.

Цикличните структури в Perl превъзхождат тези в езика C, тъй като те могат да бъдат „именувани“ с етикети и позволяват излизане от дълбоко вмъкнати един в друг цикли:

my $i = 0;
OUTER:
while ($i < 10)
{
43
44
45
46
47
48
49
50
51
52
53

54
55
56
}

Поeзия в Perl

На Perl можe даже да се пишат стихотворения. Едно такова стихотворение с название „Black Perl“ („Черен бисер/перла/“) е било цитирано от Лари Уол в първоаприлско писмо в Usenet. То било написано поначало на Perl 3 и по думите на самия Лари той изпитал морално удовлетворение, когато стихотворението не извадило грешки в синтактически анализатор на Perl 5. Лари е известен и с миролюбивостта си, и протеста срещу милитаристичната политика на големите държави.

   $i = $i + 1; # може да се запише съкратено $i++;
    print "$i\n";
    print "$i\n";
   $counted_to++;
   next if $counted_to == 3;
   print "$counted_to ";
   last if $counted_to == 5;
    print "\$i = $i\n";
    MIDDLE:
    for (my $j = 0; $j < 10; $j++)
    {
        print "\$j = $j\n";
        INNER:
        for my $k (0 .. 9)
        {
            print "\$k = $k";
            next MIDDLE if $i == 6;
        }
        last OUTER if $j == 2;
    }

Инсталация

Perl е част от всяка Юникс или Юникс-подобна система. Това може да бъде проверено с изпълнението на командата perl -v в шела. За Уиндоус програмната среда може да бъде безплатно свалена от сайта на ActiveState или сайта на Strawberry Perl – дистрибуция съдържаща dmake, която улеснява инсталацият на модули, изискващи make под Unix. Всяка стандартна инсталация на програмната среда може да бъде допълвана с най-различни модули от сайта на CPAN, голяма част от които функционират на различни операционни системи.

Документация

Документацията на Perl изобилства от шеги и игри на думи, за разлика от сухия език на повечето компютърна литература, а годишните обръщения на Лари („State of the Onion“, каламбур с обръщението на президента на САЩ, „State of the Union“) са ненадминати образци на духовитост.

Въпреки шеговития си характер, документацията на езика е изключително пълна и най-важното – общодостъпна. С командата perldoc <име на модул> се извежда помощта за съответния модул. Онлайн документацията изобилства с примери и указания дори и за начинаещи в езика.

Литература

Най-популярната книга за Perl е написана от автора му и е известна сред феновете на езика като „камилата“ заради картинката на обложката си.

  • Уол, Лари и др. Програмиране с Perl. ЗеСТ Прес, 2002. ISBN 978-954-90498-8-6.
  • Бланк-Еделман, Дейвид. Perl за системно администриране. ЗеСТ Прес, 2002. ISBN 978-954-91165-3-3.
  • Кристиансен, Том и др. Perl Cookbook. ЗеСТ Прес, 2005. ISBN 978-954-93410-6-5.
  • Казънс, Саймън и др. Програмиране с Perl. Софтпрес, 2001. ISBN 978-954-685-138-3.

Външни препратки