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

Изтрито е съдържание Добавено е съдържание
м й--->ѝ
- повторение
Ред 19:
 
'''Perl''' (произнася се „пърл“) е универсален, [[Интерпретативен език за програмиране|интерпретативен]] [[език за програмиране]], създаден от [[Лари Уол]] през 1987 г. Лари е трябвало да създава отчети за системата, която е поддържал тогава, но не е съществувал подходящ инструмент за целта (програмата [[awk]] не е можела да отваря и затваря файлове въз основа на информацията в тях), което го подтиква да създаде свой специализиран инструмент, който по-късно разпространява безплатно.
 
 
== Име ==
 
Първоначално името на езика е било '''Pearl''' (произнася се по същия начин – „пърл“). Още преди да излезе първата версия на езика, Лари установява, че съществува език за програмиране на име [[PEARL]]. С цел да се избегнат конфликти, а и повлиян от характерната за [[философията на Unix]] тенденция към кратки имена, Лари променя името на езика на ''Perl'', без да променя произношението му.
 
Line 28 ⟶ 26:
 
Съществува също така тънка разлика в значението в зависимост от това дали името е изписано с главна буква в началото или изцяло с малки букви. ''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 (англ. ''Comprehensive Perl Archive Network'', в превод ''Изчерпателна мрежа от архиви на Perl'') представлява огромна колекция от софтуер написан изцяло или отчасти на Perl. Основната градивна единица на този софтуер е модулът. Съществуват незадължителни, но препоръчителни (и често спазвани на практика) указания за писането на модули за Perl, с необходимата им документация, която често с простотата и стандартността си превъзхожда документацията на много комерсиални продукти.
Разработчиците на Perl създават програмни модули, разрешаващи разнообразни проблеми за почти всички [[операционна система|операционни системи]] и дори програмни езици. Тези модули обикновено са достъпни за използване под същия лиценз, както и самия Perl (т. нар. [[Artistic License]]), което допринася за по-нататъшното разрастване на общността. Всички тези модули могат да бъдат разгледани и свалени от [https://www.metacpan.org/ metacpan.org].
 
=== Обработка на текст ===
Line 50 ⟶ 44:
 
=== Използване на командния интерпретатор ===
Името на главниятглавния [[изпълним файл]] (т.е. [[интерпретатор]]а на езика, който превръща текстовия код на Perl в изпълними инструкции за [[процесор]]а) е същото като името на програмния език, но обикновено се пише с малка буква – perl в *nix системи или perl.exe в Уиндоус системи.
Този изпълним файл може да се използва за бързи изпълнения от командния ред на кратки програми наречени ''one-liners'', койтокоито биха отнели много редове (и вероятно време), ако биха били написани на други програмни езици.
 
Изпълнение на Perl програма съхранена във файл с име '''my_program.pl'''
Line 57 ⟶ 51:
или само '''./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
 
Line 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:
<source lang="perl">
print "Здравей„Здравей, свят!\n"n“;
</source>
 
 
== Вградени типове данни ==
Вградените типове данни на Perl се обозначават с помощта на сиджил (символ, използван като представка, т.е. преди името на променливата), който също така представлява и минималистична [[унгарска нотация]]:
 
* '''Скалар''' – използва сиджил <nowiki>'</nowiki>''', представлява единична стойност, която може да бъде число, символен низ или препратка (или още референция от англ. ''reference'')
Вградените типове данни на Perl се обозначават с помощта на сиджил (символ използван като представка, т.е преди името на променливата), който също така представлява и минималистична [[унгарска нотация]]:
* '''Скалар''' – използва сиджил <nowiki>'</nowiki>'''$'''<nowiki>'</nowiki>, представлява единична стойност, която може да бъде число, символен низ или препратка (или още референция от англ. ''reference'')
 
* '''Масив''' – използва сиджил <nowiki>'</nowiki>'''@'''<nowiki>'</nowiki>, представлява списък от скалари, означавани (т.е. номерирани) последователно, като масивите в Perl са 0-базирани, но това може да бъде променяно, но е силно непрепоръчително. Поредният номер на даден елемент от масива се нарича ''индекс''. Достъпът до отделни елементи от масива използва подобен на езика [[C (език за програмиране)|C]] синтаксис: '''$<'''име_на_масив'''>[<'''индекс>''']'''.
Line 108 ⟶ 97:
 
* '''Typeglob''' – използва сиджил <nowiki>'</nowiki>'''*'''<nowiki>'</nowiki> и представлява тип данни, който предоставя достъп до символните таблици в езика Perl.
 
 
Кратки примери:
Line 114 ⟶ 102:
# При декларирането на променливи в езика Perl се използва ключовата дума 'my'
# подобно на ключовата дума 'var', срещаща се в други езици.
 
 
# Деклариране на скаларни променливи.
Line 120 ⟶ 107:
my $name = "Янко";
my $number = 9;
print "$name #$number\n"n“;
 
# извежда: Янко #9
 
 
# Деклариране на масив.
#
my @names = ("Иван"„Иван“, "Петър"„Петър“, "Георги"„Георги“);
print "$names[0], $names[2] и $names[1]\n"n“;
 
# oтпечатва: Иван, Георги и Петър
 
 
# Деклариране на хеш.
Line 141 ⟶ 126:
);
 
print "Име„Име: $hash{'name'}\nФамилия: $hash{'surname'}\nМестожителство: $hash{city}\n"n“;
 
# извежда:
Line 147 ⟶ 132:
# Фамилия: Георгиев
# Местожителство: София
 
 
# Отваряне на файл за четене.
Line 154 ⟶ 138:
my @line = <$file>; # Всеки ред на файла се записва като отделен елемент на масива.
close $file;
 
 
# Деклариране на функция / подпрограма.
Line 167 ⟶ 150:
# Скобите са незадължителни при извикването на функции, стига
# нейната дефиниция да е преди употребата ѝ, но неизползването на скобите
# eе добре да бъде прилагано само за вградените функции.
#
count_to 4;
Line 178 ⟶ 161:
 
# Отпечатва абсолютно същото, но е препоръчително
# сиджиласиджилът за функции, да бъде използван само, когато е нужна
# рефенрецияреференция към функция.
&count_to(4);
 
 
# Съхранява референция към функция в скалар.
my $count_to_ref = \&count_to;
 
# Извикването на тази референция става, като първо диреференцираме,диференцираме или използваме записа с ->.
&$count_to_ref(10);
$count_to_ref->(10);
 
# Когато се използват затваряния (closure), се използват тъкмо референции към аниномнианонимни функции
#
my $pow_generator = sub {
Line 202 ⟶ 184:
 
my $pow3 = $pow_generator->(3);
print $pow3->(2), "\n"n“; # извежда: 8 = 2^3
</source>
 
 
== Основни контролни структури ==
 
Контролните структури в Perl могат да се записват по два начина. При първият кодът, който ще се изпълнява, е разположен на произволен брой редове, при другия – само на един.
За разлика от езика [[C (език за програмиране)|C]], в Perl е задължителна употребата на фигурни скоби за структурите използващи един единствен оператор.
 
=== Условни структури ===
 
==== if ====
КодаКодът се изпълнява само ако условието се изпълни:
 
<source lang='perl'>
my $today = "понеделник";
 
if ($today eq "понеделник"„понеделник“) {
print "Днес е понеделник!\n";
}
Line 229 ⟶ 208:
<source lang='perl'>
my $today = "понеделник";
print "Днес„Днес е понеделник!\n"n“ if $today eq "понеделник"„понеделник“; # Скобите на структурите от този вид са незадължителни.
</source>
 
Line 235 ⟶ 214:
<source lang='perl'>
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 {
Line 253 ⟶ 232:
 
==== unless ====
'''unless''' е обратната на '''if''', и еквивалентна на '''if not'''. КодаКодът се изпълнява, когато условието пропадне.
<source lang='perl'>
my $today = "понеделник";
print "Днес„Днес е делник!" if not $today eq "събота"„събота“ || $today eq "неделя"„неделя“;
# извежда: Днес е делник!
</source>
 
 
=== Циклични структури ===
Line 265 ⟶ 243:
 
==== while ====
При '''while''' кодът се изпълнява, докато условието не се провали.
<source lang='perl'>
my $i = 0;
while ($i <= 9) {
�35�
print "$i\n";
�36�
$i = $i + 1; # може да се запише съкратено $i++;
}
</source>
Line 279 ⟶ 257:
for (my $i = 0; $i <= 9; $i++)
{
�37�
print "$i\n";
}
</source>
Line 288 ⟶ 266:
foreach my $i (0 .. 9) # бинарният оператор '..' връща масив с елементите от интервалa [$a, $b], записан като $a .. $b
{
print "$i\n";
}
</source>
 
 
За прекъсване на цикъл или итерация (изпълнение) се използват:
Line 301 ⟶ 278:
 
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>
Тази програма трябва да брои от 1 до 10 според условието в '''while''', но числото 3 не се извежда, защото при всяка итерация се прави проверка дали '''$counted_to''' не е 3, ако е, се пропуска. Също така цикълацикълът няма да стигне никога до 10, защото когато стигне 5, ще се изпълни '''last''' и цикълацикълът ще прекъсне.
 
Цикличните структури в Perl превъзхождат тези в езика C, тъй като те могат да бъдат „именувани“ с етикети и позволяват излизане от дълбоко вмъкнати един в друг цикли:
 
Цикличните структури в Perl, са превъзхождат тези в езика C, тъй като те могат да бъдат "именувани" с етикети и позволяват излизане от дълбоко вмъкнати един в друг циккли:
<source lang='perl'>
my $i = 0;
Line 316 ⟶ 292:
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";
MIDDLE:
Line 327 ⟶ 332:
next MIDDLE if $i == 6;
}
 
last OUTER if $j == 2;
}
$i++;
}
</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 изобилства от шеги и игри на думи, за разлика от сухия език на повечето компютърна литература, а годишните обръщения на Лари („State of the Onion“, каламбур с обръщението на президента на САЩ, „State of the Union“) са ненадминати образци на духовитост.
 
Въпреки шеговитиятшеговития си характер, документацията на езика е изключително пълна и най-важното общодостъпна. С командата ''perldoc <име на модул>'' се извежда помощта за съответния модул. [http://perldoc.perl.org/perl.html Онлайн документацията] изобилства с примери и указания дори и за начинаещи в езика.
 
 
== Литература ==
 
Най-популярната книга за Perl е написана от автора му и е известна сред феновете на езика като „камилата“ заради картинката на обложката си.
* {{cite book |last= Уол |first= Лари |authorlink= |coauthors= Том Кристиансен, Йон Орвант |title= Програмиране с Perl |year= 2002 |publisher= ЗеСТ Прес |location= |isbn= 978-954-90498-8-6 }}
Line 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 |year= 2001 |publisher= Софтпрес |location= |isbn= 978-954-685-138-3 }}
 
 
== Външни препратки ==
 
* [http://2009.perlbulgaria.org/ Perl-воркшоп 2009]
 
* [http://www.perl.com/ Официална страница на Perl]
* [http://www.cpan.org/ CPAN] (Comprehensive Perl Archive Network, огромен архив с модули за Perl)