Това е превод на български от Теодора Берова на втория урок от поредицата уроци, които водих преди време за QA-отдела на голяма международна компания, по покана на Светлин Наков.
Искам да го споделя с всеки, който търси непреходни знания по Perl.
Обновяванията след 1ви юни 2014 и преводът са направени с подкрепата на Chain Solutions (http://chainsolutions.net/).
Таблица със съдържанието на курса може да бъде намерена на http://i-can.eu/ .
Изходният код на примерите и уроците в ODP формат се намират на адрес https://github.com/kberov/PerlProgrammingCourse/ .
1. Курс по
програмиране на Perl
Скаларни типове данниСкаларни типове данни
Автор: Красимир Беров, Превод: Теодора Берова
I-can.eu С любезното съдействие на Chain Solutions
2. Съдържание
1. Типове на променливите и данните в Perl
2. Числови оператори
3. Низови оператори
4. Скаларни функции (кратко изложение)
5. Недефинирани величини
6. Преобразуване на типове в Perl?!
7. Референции
3. Променливи/типове данни
В Perl има три главни типа променливи:
– скалари
– масиви
– хешове
... Плюс два допълнителни:
– typeglobs (глобални типове)
– файлови манипулатори
Виж: perlintro, perldata
4. Имена на променливи
● Стойностите обикновено се означават с име, или чрез
именувана препратка (референция).
● Първият знак указва вида/типа структура от данни
($,@,%).
● После е името на съответната стойност.
● Обикновено името е единичен идентификатор – низ,
започващ с буква или долна черта, който може да
съдържа букви, долни черти и цифри.
● Може да бъде също и поредица от идентификатори,
разделени с :: (виж perlmod/Packages, perlref).
5. Скаларите в Perl
● Един скалар може да съдържа просто низ (с размер,
ограничен единствено от наличната памет), число
или референция към нещо (виж perlref).
● Има и някои “магически” скалари, чиито имена
приличат на препинателни знаци или безсмислици
($_, $/, $] ...).
my $animal = "camel";my $animal = "camel";
my $answer = 22;my $answer = 22;
print "Me: Hello $animal! How old are you?n";print "Me: Hello $animal! How old are you?n";
print "$animal: $answer.$/";print "$animal: $answer.$/";
print '-'x 20, $/;print '-'x 20, $/;
print 'Named reference: ',${animal},$/;print 'Named reference: ',${animal},$/;
$Other::animal = 'llama';$Other::animal = 'llama';
print "From package 'Other': $Other::animaln";print "From package 'Other': $Other::animaln";
print 'Perl version: ',$], $/;print 'Perl version: ',$], $/;
6. Масивите в Perl
● Масивите представляват подредени списъци
от скалари, където всеки елемент има
пореден номер (индекс), започващ от 0.
my @animals = ("camel", "llama", "пиле");my @animals = ("camel", "llama", "пиле");
my @numbers = (23, 42, 69);my @numbers = (23, 42, 69);
my @mixed = ("camel", 42, 1.23);my @mixed = ("camel", 42, 1.23);
print @animals .$/;#what the...;) scalar contextprint @animals .$/;#what the...;) scalar context
print "@animals" . $/;#interpolated arrayprint "@animals" . $/;#interpolated array
print "@animals @numbers" . $/;#interpolated arraysprint "@animals @numbers" . $/;#interpolated arrays
print @animals, @numbers, $/;#list contextprint @animals, @numbers, $/;#list context
7. Хешовете в Perl
● Хешът е неподредена съвкупност от скаларни
стойности, които се индексират със собствен
асоцииран низ-ключ. Т.е. хешът се състои от
двойки ключ/стойност. Наричат хеша още и
асоциативен масив.
my %fruit_colors = (my %fruit_colors = (
apple => "red",apple => "red",
banana => "yellow",banana => "yellow",
););
printprint
map { "$_ => $fruit_colors{$_}n" }map { "$_ => $fruit_colors{$_}n" }
sortsort
keys %fruit_colors;keys %fruit_colors;
print "%fruit_colorsn"; #хешовете НЕ СЕ интерполиратprint "%fruit_colorsn"; #хешовете НЕ СЕ интерполират
9. Скаларни стойности
● Всяко парче данни в Perl е скалар, масив от
скалари или хеш от скалари.
● Скаларът може да съдържа една единствена
стойност, която да е:
– Низ
– Число
– Референция (за това по-нататък)
– Файлов манипулатор (друг път (I/O) )
● Превръщането от един формат в друг е прозрачно
(автоматично).
● По подразбиране, скаларните стойности са
недефинирани.
10. Какво са скаларите (отново)
● Скаларът е единичен низ, число или
препратка (референция) към нещо.
● Стойността на един скалар се приема за
TRUE (ИСТИНА) в булев смисъл, ако не е
нулев (празен) низ или числото 0 (или
низовият еквивалент на "0").
#пробвайте това в терминал#пробвайте това в терминал
>perl -e 'print "truen" if "0" '>perl -e 'print "truen" if "0" '
>perl -e 'print "falsen" unless "0" '>perl -e 'print "falsen" unless "0" '
>...>...
11. Скаларни функции или оператори?
● Много от вградените функции в Perl често се
наричат именувани оператори.
● Има няколко категории, в зависимост от
употребата, типа данни (които се обработват
или създават) и т.н.
● Например:
– Функции за скалари или низове
– Числови функции
– Регулярни изрази и шаблони за съответствие...
● Една функция/оператор може да попадне в една или
няколко категории, в зависимост от контекста.
12. Операторът за присвояване
● Най-използваният оператор за скаларна (и
масив или хеш) променлива е операторът за
присвояване.
● По този начин ние задаваме стойност на
променлива.
● По този начин ние даваме име на литерална
(буквална) стойност.
my $name = 'Larry Wall';my $name = 'Larry Wall';
print 'My name is ', $name, $/;print 'My name is ', $name, $/;
14. Числови оператори
● abs VALUE
abs
Връща абсолютната стойност на аргумента си. Ако
abs е без VALUE, използва $_.
● Виж perlfunc/abs
my $answer = -22;my $answer = -22;
print abs $answer;print abs $answer;
print abs "$answer";print abs "$answer";
15. Числови оператори
● hex EXPR
hex
Възприема EXPR като шестнадесетичен низ и
връща десетичната стойност. (За преобразуването
на низове, които може да започват с 0, 0x или 0b,
виж oct.) Ако EXPR не е подаден, използва $_.
● За да представите нещо като hex (в
шестнадесетичен вид), погледнете printf, sprintf, или
unpack.
● Виж perlfunc/hex
print hex '0xBf';print hex '0xBf';
print hex 'bF';print hex 'bF';
16. Числови оператори
● oct EXPR
oct
Разглежда EXPR като осмичен низ и връща съответната
стойност.
– Ако EXPR започва с 0x, го разглежда катоАко EXPR започва с 0x, го разглежда като
шестнадесетичен низ.шестнадесетичен низ.
– Ако EXPR започва с 0b, го разглежда като двоичен низ.Ако EXPR започва с 0b, го разглежда като двоичен низ.
– Интервалът се пренебрегва и в трите случая.Интервалът се пренебрегва и в трите случая.
– Ако EXPR не е подаден, използва $_.Ако EXPR не е подаден, използва $_.
– За да превърнете десетично число в осмичен вид,За да превърнете десетично число в осмичен вид,
ползвайте sprintf() или printf().ползвайте sprintf() или printf().
print( oct 0b10, $/);print( oct 0b10, $/);
print( oct '0xBf', $/);print( oct '0xBf', $/);
print( oct '07', $/);print( oct '07', $/);
print( oct '0777', $/);print( oct '0777', $/);
17. Оператори за низ
● Именувани оператори (функции) за скалари
или низове
– length, chop and chomp, uc/lc
18. Оператори за низ
● length EXPR
length
Връща дължината в символи на стойността на EXPR.
– АкоАко EXPR е пропуснат, връща дължината на $_.EXPR е пропуснат, връща дължината на $_.
– Не може да се използва с масив или хеш за намиранеНе може да се използва с масив или хеш за намиране
броя на елементите им.броя на елементите им.
– За целта, използвайтеЗа целта, използвайте scalar @arrayscalar @array и съответнои съответно
scalar keys %hashscalar keys %hash..
– Ако EXPR е в Unicode, ще получите броя на символите, аАко EXPR е в Unicode, ще получите броя на символите, а
не броя на байтовете.не броя на байтовете.
use utf8;use utf8;
print( length 'kniga' , $/);print( length 'kniga' , $/);
use bytes;use bytes;
print( length 'книга', $/);print( length 'книга', $/);
no bytes;no bytes;
print( length 'книга', $/);print( length 'книга', $/);
19. Оператори за низ
● chop VARIABLE
chop( LIST )
chop
Премахва последния знак от низ и връща премахнатия знак.
– Ако VARIABLE е пропусната, премахва последния знак от $_.Ако VARIABLE е пропусната, премахва последния знак от $_.
– Ако VARIABLE е хеш, работи със стойностите на хеша, но не иАко VARIABLE е хеш, работи със стойностите на хеша, но не и
неговите ключове.неговите ключове.
– Ако прилагате chop върху списък, премахвате последнияАко прилагате chop върху списък, премахвате последния
символ от всеки елемент от него. Връща само последносимвол от всеки елемент от него. Връща само последно
премахнатата стойност.премахнатата стойност.
#!/usr/bin/perl -C#!/usr/bin/perl -C
#binmode(STDOUT, ':encoding(cp866)');#on win32#binmode(STDOUT, ':encoding(cp866)');#on win32
use utf8;use utf8;
binmode(STDOUT, ':utf8');binmode(STDOUT, ':utf8');
my ($bob_latin, $bob_cyr) = ('bob', 'боб');my ($bob_latin, $bob_cyr) = ('bob', 'боб');
print( chop($bob_latin) , $/, chop($bob_cyr) , $/);print( chop($bob_latin) , $/, chop($bob_cyr) , $/);
20. Оператори за низ
● chomp VARIABLE
chomp( LIST )
chomp
По-сигурна версия на chop.
– Премахва последният символ, който съответстваПремахва последният символ, който съответства
на текущата стойност на $/,на текущата стойност на $/, от низаот низа..
– Връща общия брой на знаците, отстранени отВръща общия брой на знаците, отстранени от
всичките му аргументи.всичките му аргументи.
#binmode(STDOUT, ':encoding(cp866)');#on win32#binmode(STDOUT, ':encoding(cp866)');#on win32
use utf8;use utf8;
binmode(STDOUT, ':utf8');binmode(STDOUT, ':utf8');
my ($bob_latin, $bob_cyr) = ("bobn", "боб$/");my ($bob_latin, $bob_cyr) = ("bobn", "боб$/");
print( $bob_latin, $bob_cyr, $/ );print( $bob_latin, $bob_cyr, $/ );
print( chomp($bob_latin,$bob_cyr) , $/ );print( chomp($bob_latin,$bob_cyr) , $/ );
print( $bob_latin, $bob_cyr, $/ );print( $bob_latin, $bob_cyr, $/ );
21. Оператори за низ
● lc EXPR
lc
Връща вариант на EXPR с малки букви. Ако EXPR
не е подаден, ползва $_.
● uc EXPR
uc
Връща вариант на EXPR с главни букви. Ако EXPR
не е подаден, ползва $_.
#binmode(STDOUT, ':encoding(cp866)');#on win32#binmode(STDOUT, ':encoding(cp866)');#on win32
use utf8;use utf8;
binmode(STDOUT, ':utf8');binmode(STDOUT, ':utf8');
my ($lcstr, $ucstr) = ("BOBn", "боб$/");my ($lcstr, $ucstr) = ("BOBn", "боб$/");
print( lc $lcstr, uc($ucstr), $/ );print( lc $lcstr, uc($ucstr), $/ );
23. Не/дефинирани величини
● undef EXPR
undef
?Премахва стойността на EXPR, като EXPR трябва да
е lvalue.
– Използва се само върху скаларна стойност, масив (@),
хеш (%), подпрограма (&) или глобален тип (*)...
– Винаги връща неопределена (празна) стойност.
use strict; use warnings; use diagnostics;use strict; use warnings; use diagnostics;
my $name;my $name;
print $name ,$/;print $name ,$/;
$name ="Larry";$name ="Larry";
print $name ,$/;print $name ,$/;
undef $name ;undef $name ;
print $name ,$/;print $name ,$/;
24. Не/дефинирани величини
● defined EXPR
defined
Връща булева стойност, казваща дали EXPR има стойност,
различна от недефинираната стойност undef.
– Ако EXPR е пропуснат, проверява $_.Ако EXPR е пропуснат, проверява $_.
– Позволява да разграничите undef от другите стойности.Позволява да разграничите undef от другите стойности.
– Простият булев тест няма да може да направи разлика междуПростият булев тест няма да може да направи разлика между
undef, zero, празен низ и "0", които са все „лъжа“.undef, zero, празен низ и "0", които са все „лъжа“.
my $data;my $data;
print $data if defined($data);print $data if defined($data);
$data = 0;$data = 0;
print defined($data);print defined($data);
print $data if defined($data);print $data if defined($data);
undef $data;undef $data;
print defined($data);print defined($data);
$_ = 2;$_ = 2;
print defined;print defined;
25. Скаларни функции (обобщение)
● Функции за скалари или низове
– chomp, chop, chr, crypt, hex, index, lc, lcfirst,
length, oct, ord, pack, q//, qq//, reverse, rindex,
sprintf, substr, tr///, uc, ucfirst, y///
● Числови функции
– abs, atan2, cos, exp, hex, int, log, oct, rand, sin,
sqrt, srand
● Разни функции
defined, eval, formline, local, my, our, reset, scalar,
undef, wantarray
● Виж perlfunc
26. Операции за преобразуване на тип :X :(
● C оператори, липсващи в Perl:
– Ооператор за преобразуване на типове
– ...
● От perlglossary:
– Преобразуване на тип (Type casting): Превръщане
на данни от един тип в друг. C позволява това.
Perl не се нуждае от него. Нито пък го иска.
27. Референции (Препратки)
● Един скалар може още да съдържа референция.
● Референцията е просто парче данни, сочещо към друго парче данни
(безименно или именувано).
● В Perl, една референция е винаги скалар, докато данните, към които
сочи, може и да не са.
● Езици като C и C++ имат функционалност, подобна на референциите,
наречена указатели (pointers).
● Указателите оставят на програмиста тълкуването на това, към което
сочат.
● Референциите просто съдържат местоположенията на конкретни,
ясно определени структури от данни – може и не предварително
дефинирани, но дефинирани все пак.
● Референциите ви позволяват да оставите разпределението на
компютърната памет на самия компютър.
28. Референции
● ref EXPR
ref
Връща не-празен низ, ако EXPR е референция, а ако не е –
връща празен низ.
– Ако EXPR не е указано, се използва $_.Ако EXPR не е указано, се използва $_.
– Върнатата стойност зависи от типа на онова, към коетоВърнатата стойност зависи от типа на онова, към което
е референцията.е референцията.
– Вградените типове включват:Вградените типове включват:
SCALAR, ARRAY, HASH, CODE, REF, GLOB, LVALUE,SCALAR, ARRAY, HASH, CODE, REF, GLOB, LVALUE,
FORMAT, IO, RegexpFORMAT, IO, Regexp
– Ако референцията е към обект, който е получил имеАко референцията е към обект, който е получил име
((blessblessed – вижed – виж built-in bless functionbuilt-in bless function) от пакет, се връща) от пакет, се връща
само името на пакета.само името на пакета.
– Можете да мислите заМожете да мислите за refref като закато за typeoftypeof оператор.оператор.
29. Референции
● Пример
● Референциите ще бъдат обсъдени друг път
use Data::Dumper;use Data::Dumper;
my %hash = (me =>'you' );my %hash = (me =>'you' );
my @array = ('we',%hash,['them']);my @array = ('we',%hash,['them']);
my $scalar = @array;my $scalar = @array;
print ref $scalar, $/;print ref $scalar, $/;
print $scalar,$/;print $scalar,$/;
print Dumper($scalar);print Dumper($scalar);
31. Упражнения
1. Напишете програма, която превръща шестнайсетично
число в десетично и го показва на екран.
2. Напишете програма, която показва абсолютната
стойност на отрицателно число.
3. Напишете програма, която премахва последната буква
от низ (без значение какъв е) и показва тази буква на
екрана.
4. Напишете програма, която преобразува число в
съответната му буква и показва буквата на екран.
5. Напишете програма, която отпечатва (print) низът
'Здрасти' три пъти на три отделни реда, като използвате
само една конструкция за отпечатване.