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

Изтрито е съдържание Добавено е съдържание
м r2.7.3) (Робот Добавяне: kk:Perl (бағдарламалау тілі)
Редакция без резюме
Ред 1:
]]{{Информация за програмен език
|име = Perl (Пърл)
|лого =
|парадигма = [[Функционално програмиране|функционален]], [[Обектно-ориентирано програмиране|обектно-ориентиран]], [[Процедурно програмиране|процедурен]]
|година = 1987
|дизайнер = [[Лари Уол]]
|последна_версия = 5.816.82
|последна_дата_на_издание = [[JanuaryNovember 311]], [[20062012]]
|типизация = динамична
|реализации =
|диалекти =
|повлиян_от = [[AWK]], [[BASIC-PLUS]],C_(език_за_програмиране) | [[C]], [[C++]], [[Lisp]], [[Pascal]], [[Sed]], [[Smalltalk 80]], [[Unix shell]]
|повлиял = [[Python]], [[PHP]], [[Ruby]], [[ECMAScript]], [[LPC]], [[Windows PowerShell]], [[JavaScript]], [[Falcon]], [[Perl 6]], [[Qore]]
|платформа = [[Cross-platform]]
|лиценз = [[GNU General Public License|GPL]] or [[Artistic License]]
|сайт = [http://www.perl.org/ www.perl.org]
}}
 
'''Perl''' (произнася се „пърл“) е универсален, [[Интерпретативен език за програмиране|интерпретативен]] [[език за програмиране]], създаден от [[Лари Уол]] през 1987 г. Лари е трябвало да създава отчети за системата, която е поддържал тогава и не е имало подходящ инструмент в момента (програмата [[awk]] не е можела да отваря и затваря файлове въз основа на информацията в тях), а не му се е искало да създава специализиран инструмент. Така на бял свят се е появил нов език.
'''Perl''' (произнася се „пърл“) е универсален, [[Интерпретативен език за програмиране|интерпретативен]] [[език за програмиране]], създаден от [[Лари Уол]] през 1987 г. Лари е трябвало да създава отчети за системата, която е поддържал тогава, но не е съществувал подходящ инструмент за целта (програмата [[awk]] не е можела да отваря и затваря файлове въз основа на информацията в тях), което го подтиква да създаде свой специализиран инструмент, който по късно разпространява безплатно.
 
 
Line 23 ⟶ 24:
Първоначално името на езика е било '''Pearl''' (произнася се по същия начин — „пърл“). Още преди да излезе първата версия на езика, Лари установява, че съществува език за програмиране на име [[PEARL]]. С цел да се избегнат конфликти, а и повлиян от характерната за [[философията на Unix]] тенденция към кратки имена, Лари променя името на езика на ''Perl'', без да променя произношението му.
 
Впоследствие се появяват интерпретации на името като съкращение, най-популярната от които е ''Practical Extraction and Report Language'' (в превод: ''практичен език за извличане и отчети''). Съществуват и много други интерпретации, включително и такива от самия Лари Уол, като например шеговитото ''Pathologically Eclectic Rubbish Lister'' (в превод: ''патологично многостранен изброител на глупости''). Всички те обаче са [[бекроним|бекроними]]. Името на езика не е съкращение от нищо, поради което се пише само с една главна буква — ''Perl'', а не ''PERL'' (за разлика от споменатия език ''PEARL'', чието име наистина е съкращение).
 
Съществува също така тънка разлика в значението в зависимост от това дали името е изписано с главна буква в началото или изцяло с малки букви. ''Perl'' е името на езика за програмиране, което, както (почти) всяко друго име, се пише с главна буква. Под ''perl'' се има предвид интерпретатора на езика ПърлPerl, т.е. програмата, която се стартира, за да се изпълни даден код на ПърлPerl. Името на интерпретатора спазва неписаното правило имената на команди под [[Юникс]] да са изцяло с малки букви.
 
 
== Основни характеристики на 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.
 
== Свойства на Пърл ==
В Пърл са заимствани концепции от доста езици — [[C]], [[awk]], [[sed]], [[Lisp]] и др. Най-силните му черти са регулярните изрази ([[английски език|англ]]. ''regular expression'', често съкращавано на ''regex''), вградените сложни [[структури от данни]] (обикновени и асоциативни масиви) и един от най-големите в света набори от свободно достъпни модули [http://cpan.org/ CPAN]. На Пърл може да се пише [[процедурно програмиране|процедурно]], [[обектно-ориентирано програмиране|обектно-ориентирано]] и [[функционално програмиране|функционално]] (поддържа [[обвивка (програмиране)|обвивки]], една от най-мощните абстракции в компютърната наука). Пърл е [[слабо типизиран език]]. Той е интерпретиран, като програмата първо се компилира до машиннонезависими инструкции ([[байткод]]), които се изпълняват от интерпретатора. За разлика от [[Java]] обаче, байткодът не е лесно достъпен, благодарение на което са избегнати редица проблеми с обратната съвместимост. Интерпретаторът на Пърл e написан на [[C]] и е преносим на огромен брой платформи и [[операционна система|операционни системи]]. Програмата [http://www.indigostar.com/perl2exe.htm perl2exe ] и модулът [http://search.cpan.org/~autrijus/PAR-0.85_01/script/pp pp] могат да бъдат използвани за произвеждане (генериране) на изпълними програми от скриптове на Пърл.
 
== Предимства на езика ==
 
=== Общността CPAN ===
CPAN (англ. ''Comprehensive Perl Archive Network'', в превод ''Изчерпателна мрежа от архиви на Perl'') представлява огромна колекция от софтуер написан изцяло или отчасти на Perl. Основната градивна единица на този софтуер е модулът. Съществуват незадалжителни, но препоръчителни (и често спазвани на практика) указания за писането на модули за Perl, с необходимата им документация, която често с простотата и стандартността си превъзхожда документацията на много комерсиални продукти.
Разработчиците на Perl създават програмни модули, разрешаващи разнообразни проблеми за почти всички [[операционна система|операционни системи]] и дори програмни езици. Тези модули обикновено са достъпни за използване под същия лиценз, както и самия Perl (т. нар. [[Artistic License]]), което допринася за по-нататъшното разрастване на общността. Всички тези модули могат да бъдат разгледани и свалени от [https://www.metacpan.org/ metacpan.org].
 
=== Обработка на текст ===
Най-силната страна на ПърлPerl е обработката на текст. Това го прави изключително популярен сред системните администратори. Операции като отваряне, четене, [[синтактичен разбор]] (известен още като „[[парсване]]“), търсене, заместване на текстови файлове са кратки и лесни за програмиране, имплементирани са много ефективно и се изпълняват по-бързо отколкото в повечето други езици.
 
=== Динамични уеб страници ===
Разработчиците на динамични уеб страници (страниците, чиито съдържание се произвежда на момента на тяхното извикване — т. е. динамично) често използват ПърлPerl поради големия брой безплатни скриптове, както и общността на разработчици предлагащи помощ на своите колеги. Богатата библиотека с модули, споменатата мощна текстообработка, която често се налага при генерирането на [[HTML]] страници, както и фактът, че е слабо типизиран и интерпретиран език, правят възможна бързата разработка на приложения в много области, включително и настолни графични приложения.
 
Фактът, че ПърлPerl се интерпретира в момента на изпълнение, налага [[уеб сървър]]ът да стартира на интерпретатора ''perl'' за всяка [[уеб страница]], която трябва да се генерира. При по-натоварени сайтове това може да доведе до значително натоварване на системата, както откъм памет, така и откъм процесорно време. За да се избегне това, специално за ПърлPerl е създаден модула ''mod_perl'' за сървъра [[Apache]], който на практика представлява интерпретатор за ПърлPerl, вграден в кода на Apache. Това позволява на уеб сървъра да изпълнява код на ПърлPerl, без да се налага да стартира нов [[процес (операционна система)|процес]] за всяка заявена уеб страница. Това води до значително увеличение на производителността при намалени ресурси. Mod_perl отива дори още по-надалеч и дава на скриптовете на ПърлPerl достъп до всички „вътрешности“ на самия Apache сървър, като им позволява да се намесват във всеки един етап от доставянето на [[HTML]] страницата, както и да използват конструкции на ПърлPerl в конфигурационните файлове на Apache.
 
=== Общността CPAN ===
CPAN (англ. ''Comprehensive Perl Archive Network'', в превод ''Изчерпателна мрежа от архиви на Пърл'') представлява огромна колекция от софтуер написан изцяло или отчасти на Пърл. Основната градивна единица на този софтуер е модулът. Съществуват незадалжителни, но препоръчителни (и често спазвани на практика) указания за писането на модули за Пърл, с необходимата им документация, която често с простотата и стандартността си превъзхожда документацията на много комерсиални продукти.
Разработчиците на Пърл създават програмни модули, разрешаващи разнообразни проблеми за почти всички [[операционна система|операционни системи]] и дори програмни езици. Тези модули обикновено са достъпни за използване под същия лиценз, както и самия Пърл (т. нар. [[Artistic License]]), което допринася за по-нататъшното разрастване на общността. Всички тези модули могат да бъдат разледани и свалени от [http://www.cpan.org/ сайта на CPAN]
 
=== Използване на командния интерпретатор ===
Името на главният [[изпълним файл]] (т.е. [[интерпретатор]]а на езика, който превръща текстовия код на ПърлPerl в изпълними инструкции за [[процесор]]а) е същото като името на програмния език, но обикновено се пише с малка буква — perl в *nix системи или perl.exe в Уиндоус системи.
Този изпълним файл може да се използва за бързи изпълнения от командния ред на компютъракратки програми наречени one-liners, който биха отнели много редове (и вероятно скороствреме) ако биха били изпълненинаписани на други програмни езици. Следият списък илюстрира тези примери.
 
Изпълнение на Perl програма съхранена във файл с име '''my_program.pl'''
#отвори всички файлове от типа *.с и промени foo на bar
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
 
#промени редаПроменя последователността на редовете ... навъв файловете file1 file2f1, file3f2, ...f3.
perl -e 'print reverse <>' file1f1 file2 file3 ....f2 f3
 
# промениПроменя редапоследователността на абзаците ... навъв файловете file1f1, file2 file3f2, f3....
perl -00 -e 'print reverse <>' file1f1 file2 file3 ....f2 f3
 
# Изтрива всички други редове освен тези между реда започващ със START и този започващ с END включително във файл foo.txt.
perl -i.old -ne 'print if /^START$/ .. /^END$/' foo.txt
 
# изтрий всички други редове освен тези между START и END
perl -i.old -ne 'print unless /^START$/ .. /^END$/' foo.txt
 
== Недостатъци на езика ==
Противниците на Пърл твърдят, че той има много неясен и дори откровено грозен [[синтаксис]]. Редицата синтактични съкращения, целящи пестене на време при писане на код, водят до безкраен брой от сложни за запомняне символи и структури. Мотото на езика „Има повече от един начин да го направиш“ се счита за основата на хаос от течения, които елиминират логичността и догматичността, които би трябвало да определят развитието на един програмен език. Комбинирано със слабата типизация (която по принцип е една от силните страни на Пърл), всичко това позволява да се пише код, който по-късно е неразбираем дори за самия автор. Поради това някои наричат Пърл език „само за писане“ (англ. ''write-only'').
 
Противниците на Perl твърдят, че той има много неясен и дори откровенно грозен [[синтаксис]], дължащ се на редицата синтактични съкращения, целящи пестене на време при писане на едноредови команди (one-liners), и вградените оператори за работа с [[Регулярен израз | регулярни изрази]], които значително олесяват работата със символни низове, за сметка на загадъчният си запис. Мотото на езика „Има повече от един начин да го направиш“ („There Is More Than One Way To Do It.“, съкратено TIMTOWTDI), е друг аргумент на противниците на Perl, както и слабата типизация (която всъщност е една от силните страни на Perl).
Един от начините да се избегне това, е да се спазва някакъв основен набор от правила и конвенции при писането на код, които да са общоприети от всички. Фактът, че Пърл до голяма степен не налага такива правила, обаче води до възникването на много стилови „течения“ сред програмистите на Пърл, като за хората следващи даден стил е трудно да разберат код, писан в друг стил.
 
Използването на основен набор от правила и конвенции при писането на код, като например тeзи използвани в документацията на Perl, лесно неутрализират всички синтактични особици.
 
 
== Здравей, свят! ==
 
Програмата извеждаща „Здравей, свят!“, реализирана на Perl:
== Hello, world ==
Примерната програма "Hello, world", реализирана на Perl, изглежда така
<source lang="perl">
print "Здравей, свят!\n";
#!/usr/bin/perl
print "Hello, world!\n";
</source>
 
== Основни типове данни ==
Най-използваните типове данни на Пърл са:
* '''Скаларна променлива''' - Единична стойност, която може да бъде число, низ или препратка. За по-кратко често се нарича само "скалар".
* '''Масив''' - Списък от скалари, означавани (т.е. номерирани) последователно, започвайки от 0. Поредният номер на даден елемент от масива се нарича ''индекс''. Достъпът до отделни елементи от масива става единствено чрез индекси.
* '''Хеш''' - Хешът (наричан още хеш-таблица или асоциативен масив) е ''множество'' от подредени двойки скалари. Обърнете внимание, че двойките помежду си нямат подредба или номерация, т.е. образуват математическо множество. Елементите на една конкретна двойка обаче са подредени, т.е. има първи и втори: Първият се нарича ключ (на англ. ''key''), а вторият стойност (на англ. ''value''). И двата скалара могат да бъдат произволни и няма нужда да са от един и същи тип. Достъпът до отделни стойности от хеша става чрез ключовете. В известен смисъл ключовете при хеша съответстват на индексите при масива. В това отношение хешът може да се разглежда като по-обща форма на масив, при която индексите не са ограничени до числа, а могат да бъдат произволни скалари. Тъй като ключовете се използват за идентификация на стойностите в хеша, те трябва да са уникални, т.е. да няма повторения. За разлика от тях, стойностите могат да се повтарят — на различни ключове могат да съответстват едни и същи стойности.
* '''Файлов манипулатор''' - Наричан още файлов дескриптор (от англ. ''file descriptor'' или '' file handle''), този тип променливи предоставя достъп до файл или друго поточно устройство, като например мрежова връзка, тръба (от англ. ''pipe''), и т.н. Файловият дескриптор може да бъде отворен за писане, четене или и за двете.
* '''Подпрограма''' - Подпрограмата (subroutine) е парче код, на който могат да се предават аргументи, той извършва някакво действие с тях и/или пресмята резултат, и накрая евентуално връща стойност (обикновено пресметнатата стойност, или нищо, ако няма такава).
 
== Вградени типове данни ==
 
Вградените типове данни на Perl се обозначават с помоща на сиджил (символ използван, като префикс, т.е преди името на променливата), който също така представлява и минималистична [[унгарска нотация | унгарска нотация]]:
* '''Скалар''' - използва сиджил <nowiki>'</nowiki>'''$'''<nowiki>'</nowiki>, представлява единична стойност, която може да бъде число, символен низ или препратка (или още референция от англ. ''reference'')
 
* '''Масив''' - използва сиджил <nowiki>'</nowiki>'''@'''<nowiki>'</nowiki>, представлява списък от скалари, означавани (т.е. номерирани) последователно, като масивите в Perl са 0-ла базирани, но това може да бъде променияно, но е силно непрепоръчително. Поредният номер на даден елемент от масива се нарича ''индекс''. Достъпът до отделни елементи от масива използва подобен на езика [[C_(език_за_програмиране) | C]] синтаксис: '''$<'''име_на_масив'''>[<'''индекс>''']'''.
 
* '''Хеш''' - използва сиджил <nowiki>'</nowiki>'''%'''<nowiki>'</nowiki>, (наричан още хеш-таблица или асоциативен масив) е ''множество'' от подредени двойки скалари. Като двойките помежду си нямат подредба или номерация, т.е. образуват математическо множество. Елементите на една конкретна двойка обаче са подредени, т.е. има първи и втори: Първият се нарича ключ (на англ. ''key''), а вторият стойност (на англ. ''value''). И двата скалара могат да бъдат произволни и няма нужда да са от един и същи тип. Достъпът до отделни стойности от хеша става чрез ключовете. В известен смисъл ключовете при хеша съответстват на индексите при масива. В това отношение хешът може да се разглежда като по-обща форма на масив, при която индексите не са ограничени до числа, а могат да бъдат произволни скалари. Тъй като ключовете се използват за идентификация на стойностите в хеша, те трябва да са уникални, т.е. да няма повторения. За разлика от тях, стойностите могат да се повтарят — на различни ключове могат да съответстват едни и същи стойности. Достепът до стойностите на хеша използва ситанксиса: '''$<'''име_на_хеш'''>{'''име_на_ключ'''}'''.
 
* '''Файлов манипулатор''' - няма определен сиджил, наричан още файлов дескриптор (от англ. ''file descriptor'' или '' file handle''), този тип променливи предоставя достъп до файл или друго поточно устройство, като например мрежова връзка, тръба (от англ. ''pipe''), и т.н. Файловият дескриптор може да бъде отворен за писане, четене или и за двете.
 
* '''Подпрограма''' - използва сиджил <nowiki>'</nowiki>'''&'''<nowiki>'</nowiki>. Подпрограмата (subroutine, позната още и като функция (на анлг. ''function'') е последователност от инструкции, на който могат да се предават аргументи, извършващи някакво действие с тях и/или пресмята резултат, и накрая евентуално връща стойност (обикновено пресметнаия резултат, или нищо, ако няма такъв).
 
* '''Typeglob''' - използва сиджил <nowiki>'</nowiki>'''*'''<nowiki>'</nowiki>, и представлява тип данни който предоставя достъп до символните таблици в езика Perl.
 
 
Кратки примери:
<source lang="perl">
# При декларирането на променливи в езика Perl се използва ключовата дума 'my'
#Скаларна променлива
# подобно на ключовата дума 'var', срещаща се в други езици.
$number = 5;
$name = "Иван";
print "$number, $name"; #Отпечатва: 5, Иван
 
#Масив
@names = ("Иван", "Петър", "Георги"); #Масивът се означава с @, но когато използваме само един от неговите скалари го означаваме като скалар (с $)
print "$names[0], $names[2] и $names[1]"; #Отпечатва: Иван, Георги и Петър
 
# Деклариране на скаларни променливи.
#Хеш
#
%hash = (
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']";
#Отпечатва:
#Име: Иван
#Фамилия: Георгиев
#Местожителство: София
 
print "Име: $hash{'name'}\nФамилия: $hash{'surname'}\nМестожителство: $hash{city}\n";
#Файлове манипулатор
open (FILE, "/home/georgi/file.txt"); #Прието е имената на манипулаторите да се записват с главни букви за по-добра четливост.
@array = <FILE>; #Всеки ред на файла се записва като отделен елемент на масива
close FILE;
 
# извежда:
#Подпрограма
# Име: Иван
sub countto {
# Фамилия: Георгиев
for ($i=0;$i<=$_[0];$i++) { #Аргументите се пазят в специалния масив @_.
# Местожителство: София
print"Мога да броя до $i!\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";
}
}
&countto(5); #Сайджилът (Sigil, знакът означаващ типа данни, тук - амперсанд) е незадължителен
 
# Скобите са незадължителни при извикването на функции, стига
#Отпечатва:
# нейната дефиниция да е преди употребата й, но неизползването на скобите
#Мога да броя до 1!
# e добре да бъде прилагано само за вградените функции.
#Мога да броя до 2!
#
#Мога да броя до 3!
count_to 4;
#Мога да броя до 4!
 
#Мога да броя до 5!
# 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
</source>
 
 
== Основни контролни структури ==
 
=== If ===
Контролните структури в ПърлPerl могат да се записват по два начина. При първият кодът, който ще се изпълнява, е разположен на произволен брой редове, при другия - само на един. Ето как изглежда една примерна '''if''' контролна структура:
За разлика от езика [[C_(език_за_програмиране) | C]], в Perl е задължителна употребата на фигурни скоби за структурите използващи един единствен оператор.
 
=== Условни структури ===
 
==== if ====
Кода се изпълнява само ако условието се изпълни:
 
<source lang='perl'>
my $today = "Понпонеделник";
 
if ($today eq "Пон") { #Забележете, че когато извършваме проверка, се използва eq=equal. Повече за тези оператори, по-надолу.
if ($today eq "понеделник") {
print "Днес е понеделник!\n";
}
 
#Изписва: Днес е понеделник
# извежда: Днес е понеделник!
</source>
 
А едноредовият вариант е:
Едноредов вариант:
<source lang='perl'>
my $today = "Понпонеделник";
print "Днес е понеделник!\n" if ($today eq "Понпонеделник"); #Забележете, чеСкобите проверкатана е след кода, за разликаструктурите от езици като C,този къдетовид еса обратнотонезадължителни.
</source>
 
Съществуват и начини да се направи по-мощна '''if'''. Това става с конструкциите '''else''' и '''elsif''' (Обърнете внимание как се изписва - без "е").
'''if-elsif-else'''
'''Else''' служи, за да изпълни някакви инструкции, ако условието на if е грешно. Например горният пример може да се промени така:
<source lang='perl'>
$today = "Сря";
if ($today eq "Пон") { #Забележете, че когато извършваме проверка, се използва eq=equal. Повече за тези оператори, по-надолу.
print "Днес е понеделник!\n";
} else {
print "Днес не е понеделник!\n";
}
#Изписва: Днес не е понеделник
</source>
'''Elsif''' пък служи да направи допълнителни проверки, ако твърдението на if е грешно и ако те всички са грешни се изпълнява else:
<source lang='perl'>
my $today = "Срясряда";
if ($today eq "понеделник") {
if ($today eq "Пон") { #Забележете, че когато извършваме проверка, се използва eq=equal. Повече за тези оператори, по-надолу.
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";
}
 
#Изписва: Днес е сряда
# извежда: Днес е сряда!
</source>
 
==== Unlessunless ====
'''unless''' е обратната на '''if''', и еквивалентна на '''if not'''. Кода се изпълнява когато условието пропадне.
'''Конструкцията Unless''' е обратната на If. Тя изпълнява кода, само ако твърдението е грешно:
<source lang='perl'>
my $today = "Понпонеделник";
print "Днес е делник!" unless(if not $today eq "Събсъбота" || $today eq "Неднеделя");
#Отпечатва извежда: Днес е делник!
</source>
'''Else''' може да се приложи и при Unless, конструкция elsunless обаче не съществува.
 
 
=== While ===
=== Циклични структури ===
'''While''' е циклична конструкция. Кодът се изпълнява отново и отново, докато твърдението не стане грешно.
Всички примери извеждат цифрите от 0 до 9.
 
==== while ====
При '''while''' кодът се изпълнява докато условието не се провали.
<source lang='perl'>
my $i = 0;
#Тази програма брои от 1 до 10
while ($i <= 9) {
$countto=10;
print "$i\n";
$countedto=0;
$i = $i + 1; # може да се запише съкратено $i++;
}
</source>
 
==== for ====
while($countedto <= $counto) {
'''for''' цикъл в стил C, който рядко се използва в Perl
$countedto = $countedto + 1; #Същото може да се запише и като $countedto++
<source lang='perl'>
print "$countedto ";
for (my $i = 0; $i <= 9; $i++)
{
print "$i\n";
}
</source>
 
Има и други начини да се прекъсне цикъл или итерация (изпълнение). Точно това правят:
==== foreach ====
* '''last''' - Прекъсва изпълнението на цикъла
 
* '''next''' - Преминава на следващата итерация
Ключовата дума '''foreach''', е синоним на '''for'''
<source lang='perl'>
foreach my $i (0 .. 9) # бинарният оператор '..' връща масив с елементите от интервалa [$a, $b], записан като $a .. $b
{
print "$i\n";
}
</source>
 
 
За прекъсване на цикъл или итерация (изпълнение) се използват:
* '''last''' - прекъсва изпълнението на цикъла
* '''next''' - преминава на следващата итерация
<source lang='perl'>
my $count_to = 10;
#!/usr/bin/env perl
my $counted_to = 0;
use strict;
use warnings;
use utf8;
#Тази програма брои от 1 до 10
my $countto = 10;
my $countedto = 0;
while ($countedtocounted_to <= $counttocount_to) {
$counted_to++;
$countedto = $countedto + 1; #Същото може да се запише и като $countedto++
next if ($countedtocounted_to == 3) {;
print "$counted_to next";
last if $counted_to == 5;
} else {
print "$countedto ";
}
if ($countedto == 5) {
last;
}
}
</source>
Тази програма трябва да брои от 1 до 10 според условието в '''while''', но не става точно така - Числоточислото 3 не се изписваизвежда, защото при всяка итерация се прави проверка дали '''$countedtocounted_to''' не е 3., Акоако е, се пропуска. Също така цикъла няма да стигне никога до 10, защото когато стигне 5, ще се изпълни break'''last''' и цикъла ще прекъсне.
 
 
Цикличните структури в Perl, са превъзхождат тези в езика C, тъй като те могат да бъдат "именувани" с етикети и позволяват излизане от дълбоко вмъкнати един в друг циккли:
<source lang='perl'>
my $i = 0;
OUTER:
while ($i < 10)
{
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;
}
$i++;
}
</source>
 
 
== Поeзия в Perl ==
 
На Perl можe даже да се пишат стихотворения. Едно такова стихотворение с название «Black Perl» («Черен бисер/перла/» ) е било цитирано от Лари Уол в първо априлско писмо в [[Usenet]]. То било написано поначало на Perl 3, и по думите на самия Лари, той изпитал морално удовлетворение, когато стихотворението не извадило грешки в синтактически анализатор на Perl 5. Лари е известен и с миролюбовта си, и протеста срещу милитаристичната политика на големите държави.
 
Line 246 ⟶ 366:
 
== Инсталация ==
ПърлPerl е част от всяка Юникс или [[Юникс-подобна операционна система|Юникс-подобна]] система. Това може да бъде проверено с изпълнението на командата perl -Vv в шела. За Уиндоус програмната среда може да бъде безплатно свалена от [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 }}
* {{cite book |last= Бланк-Еделман |first= Дейвид |authorlink= |coauthors= |title= Perl за системно администриране |year= 2002 |publisher= ЗеСТ Прес |location= |isbn= 978-954-91165-3-3 }}
* {{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/ Пърл-воркшоп 2009]
 
* [http://2009.perlbulgaria.org/ Perl-воркшоп 2009]
* [http://www.perl.com/ Официална страница на Пърл]
 
* [http://www.cpan.org/ CPAN] (Comprehensive Perl Archive Network, огромен архив с модули за Пърл)
* [http://www.perl.com/ Официална страница на Perl]
* [http://www.cpan.org/ CPAN] (Comprehensive Perl Archive Network, огромен архив с модули за Perl)
* [http://use.perl.org/ Новини]
* [http://dev.perl.org/ Разработка на ПърлPerl]
* [http://www.perlmonks.org/ Общност около ПърлPerl]
* [http://ptkdb.sourceforge.net/ Дебъгер за Perl/Tk]
* [http://www.unix.org.ua/orelly/ Онлайн книги на тема ПърлPerl]