Пърл (език за програмиране): Разлика между версии
Изтрито е съдържание Добавено е съдържание
м r2.7.3) (Робот Добавяне: kk:Perl (бағдарламалау тілі) |
Редакция без резюме |
||
Ред 1:
]]{{Информация за програмен език
|име = Perl
|лого =
|парадигма = [[Функционално програмиране|функционален]], [[Обектно-ориентирано програмиране|обектно-ориентиран]], [[Процедурно програмиране|процедурен]]
|година = 1987
|дизайнер = [[Лари Уол]]
|последна_версия = 5.
|последна_дата_на_издание = [[
|типизация = динамична
|реализации =
|диалекти =
|повлиян_от = [[AWK]], [[
|повлиял = [[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]] не е можела да отваря и затваря файлове въз основа на информацията в тях), което го подтиква да създаде свой специализиран инструмент, който по късно разпространява безплатно.
Line 23 ⟶ 24:
Първоначално името на езика е било '''Pearl''' (произнася се по същия начин — „пърл“). Още преди да излезе първата версия на езика, Лари установява, че съществува език за програмиране на име [[PEARL]]. С цел да се избегнат конфликти, а и повлиян от характерната за [[философията на Unix]] тенденция към кратки имена, Лари променя името на езика на ''Perl'', без да променя произношението му.
Впоследствие се появяват интерпретации на името като съкращение, най-популярната от които е ''Practical Extraction and Report Language'' (в превод: ''практичен език за извличане и отчети''). Съществуват и много други интерпретации, включително и такива от самия Лари Уол, като например шеговитото ''Pathologically Eclectic Rubbish Lister'' (в превод: ''патологично многостранен изброител на глупости''). Всички те обаче са [[бекроним|бекроними]]. Името на езика не е съкращение от нищо, поради което се пише само с една главна буква — ''Perl'', а не ''PERL'' (за разлика от споменатия език ''PEARL'', чието име наистина е съкращение).
Съществува също така тънка разлика в значението в зависимост от това дали името е изписано с главна буква в началото или изцяло с малки букви. ''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.
== Предимства на езика ==
=== Общността CPAN ===
CPAN (англ. ''Comprehensive Perl Archive Network'', в превод ''Изчерпателна мрежа от архиви на Perl'') представлява огромна колекция от софтуер написан изцяло или отчасти на Perl. Основната градивна единица на този софтуер е модулът. Съществуват незадалжителни, но препоръчителни (и често спазвани на практика) указания за писането на модули за Perl, с необходимата им документация, която често с простотата и стандартността си превъзхожда документацията на много комерсиални продукти.
Разработчиците на Perl създават програмни модули, разрешаващи разнообразни проблеми за почти всички [[операционна система|операционни системи]] и дори програмни езици. Тези модули обикновено са достъпни за използване под същия лиценз, както и самия Perl (т. нар. [[Artistic License]]), което допринася за по-нататъшното разрастване на общността. Всички тези модули могат да бъдат разгледани и свалени от [https://www.metacpan.org/ metacpan.org].
=== Обработка на текст ===
Най-силната страна на
=== Динамични уеб страници ===
Разработчиците на динамични уеб страници (страниците, чиито съдържание се произвежда на момента на тяхното извикване — т. е. динамично) често използват
Фактът, че
=== Използване на командния интерпретатор ===
Името на главният [[изпълним файл]] (т.е. [[интерпретатор]]а на езика, който превръща текстовия код на
Този изпълним файл може да се използва за бързи изпълнения от командния ред на
Изпълнение на 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
#
perl -pe 'exit if $. > 50' f1 f2 f3
#
perl -i.old -ne 'print unless 1 .. 10' foo.txt
#
perl -e 'print reverse <>'
#
perl -00 -e 'print reverse <>'
# Изтрива всички други редове освен тези между реда започващ със 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).
Използването на основен набор от правила и конвенции при писането на код, като например тeзи използвани в документацията на Perl, лесно неутрализират всички синтактични особици.
== Здравей, свят! ==
Програмата извеждаща „Здравей, свят!“, реализирана на Perl:
<source lang="perl">
print "Здравей, свят!\n";
</source>
== Вградени типове данни ==
Вградените типове данни на 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', срещаща се в други езици.
# Деклариране на скаларни променливи.
#
my
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";
}
}
# Скобите са незадължителни при извикването на функции, стига
# нейната дефиниция да е преди употребата й, но неизползването на скобите
# e добре да бъде прилагано само за вградените функции.
#
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
</source>
== Основни контролни структури ==
Контролните структури в
За разлика от езика [[C_(език_за_програмиране) | C]], в Perl е задължителна употребата на фигурни скоби за структурите използващи един единствен оператор.
=== Условни структури ===
==== if ====
Кода се изпълнява само ако условието се изпълни:
<source lang='perl'>
my $today = "
if ($today eq "понеделник") {
print "Днес е понеделник!\n";
}
# извежда: Днес е понеделник!
</source>
Едноредов вариант:
<source lang='perl'>
my $today = "
print "Днес е понеделник!\n" if
</source>
'''if-elsif-else'''
<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 {
print "Днес е почивен ден!\n";
}
# извежда: Днес е сряда!
</source>
====
'''unless''' е обратната на '''if''', и еквивалентна на '''if not'''. Кода се изпълнява когато условието пропадне.
<source lang='perl'>
my $today = "
print "Днес е делник!"
#
</source>
=== Циклични структури ===
Всички примери извеждат цифрите от 0 до 9.
==== while ====
При '''while''' кодът се изпълнява докато условието не се провали.
<source lang='perl'>
my $i = 0;
while ($i <= 9) {
print "$i\n";
$i = $i + 1; # може да се запише съкратено $i++;
}
</source>
==== for ====
'''for''' цикъл в стил C, който рядко се използва в Perl
<source lang='perl'>
for (my $i = 0; $i <= 9; $i++)
{
print "$i\n";
}
</source>
==== foreach ====
Ключовата дума '''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;
my $counted_to = 0;
while ($
$counted_to++;
next if
print "$counted_to
last if $counted_to == 5;
}
</source>
Тази програма трябва да брои от 1 до 10 според условието в '''while''', но
Цикличните структури в 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:
== Инсталация ==
== Документация ==
Документацията на
Въпреки шеговитият си характер, документацията на езика е изключително пълна и най-важното общодостъпна. С командата ''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/ Perl-воркшоп 2009]
* [http://www.perl.com/ Официална страница на Perl]
* [http://www.cpan.org/ CPAN] (Comprehensive Perl Archive Network, огромен архив с модули за Perl)
* [http://use.perl.org/ Новини]
* [http://dev.perl.org/ Разработка на
* [http://www.perlmonks.org/ Общност около
* [http://ptkdb.sourceforge.net/ Дебъгер за Perl/Tk]
* [http://www.unix.org.ua/orelly/ Онлайн книги на тема
|