31
Курс по програмиране на Perl Скаларни типове данни Скаларни типове данни Автор: Красимир Беров, Превод: Теодора Берова I-can.eu С любезното съдействие на Chain Solutions

Скаларни типове данни

Embed Size (px)

DESCRIPTION

Това е превод на български от Теодора Берова на втория урок от поредицата уроци, които водих преди време за QA-отдела на голяма международна компания, по покана на Светлин Наков. Искам да го споделя с всеки, който търси непреходни знания по Perl. Обновяванията след 1ви юни 2014 и преводът са направени с подкрепата на Chain Solutions (http://chainsolutions.net/). Таблица със съдържанието на курса може да бъде намерена на http://i-can.eu/ . Изходният код на примерите и уроците в ODP формат се намират на адрес https://github.com/kberov/PerlProgrammingCourse/ .

Citation preview

Page 1: Скаларни типове данни

Курс по програмиране на Perl

Скаларни типове данниСкаларни типове данни

Автор: Красимир Беров, Превод: Теодора Берова

I-can.eu С любезното съдействие на Chain Solutions

Page 2: Скаларни типове данни

Съдържание

1. Типове на променливите и данните в Perl

2. Числови оператори

3. Низови оператори

4. Скаларни функции (кратко изложение)

5. Недефинирани величини

6. Преобразуване на типове в Perl?!

7. Референции

Page 3: Скаларни типове данни

Променливи/типове данни

В Perl има три главни типа променливи:– скалари

– масиви

– хешове

... Плюс два допълнителни:– typeglobs (глобални типове)

– файлови манипулатори

Виж: perlintro, perldata

Page 4: Скаларни типове данни

Имена на променливи

● Стойностите обикновено се означават с име, или чрез именувана препратка (референция).

● Първият знак указва вида/типа структура от данни ($,@,%).

● После е името на съответната стойност.

● Обикновено името е единичен идентификатор – низ, започващ с буква или долна черта, който може да съдържа букви, долни черти и цифри.

● Може да бъде също и поредица от идентификатори, разделени с :: (виж perlmod/Packages, perlref).

Page 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::animal\n";print "From package 'Other': $Other::animal\n";print 'Perl version: ',$], $/;print 'Perl version: ',$], $/;

Page 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 contextprint "@animals" . $/;#interpolated arrayprint "@animals" . $/;#interpolated arrayprint "@animals @numbers" . $/;#interpolated arraysprint "@animals @numbers" . $/;#interpolated arraysprint @animals, @numbers, $/;#list contextprint @animals, @numbers, $/;#list context

Page 7: Скаларни типове данни

Хешовете в Perl

● Хешът е неподредена съвкупност от скаларни стойности, които се индексират със собствен асоцииран низ-ключ. Т.е. хешът се състои от двойки ключ/стойност. Наричат хеша още и асоциативен масив.

my %fruit_colors = (my %fruit_colors = ( apple => "red",apple => "red", banana => "yellow",banana => "yellow",););print print map { "$_ => $fruit_colors{$_}\n" } map { "$_ => $fruit_colors{$_}\n" } sortsort keys %fruit_colors;keys %fruit_colors;print "%fruit_colors\n"; #хешовете НЕ СЕ интерполиратprint "%fruit_colors\n"; #хешовете НЕ СЕ интерполират

Page 8: Скаларни типове данни

Обратно към скаларите!..

Page 9: Скаларни типове данни

Скаларни стойности

● Всяко парче данни в Perl е скалар, масив от скалари или хеш от скалари.

● Скаларът може да съдържа една единствена стойност, която да е:– Низ

– Число

– Референция (за това по-нататък)

– Файлов манипулатор (друг път (I/O) )

● Превръщането от един формат в друг е прозрачно (автоматично).

● По подразбиране, скаларните стойности са недефинирани.

Page 10: Скаларни типове данни

Какво са скаларите (отново)

● Скаларът е единичен низ, число или препратка (референция) към нещо.

● Стойността на един скалар се приема за TRUE (ИСТИНА) в булев смисъл, ако не е нулев (празен) низ или числото 0 (или низовият еквивалент на "0").

#пробвайте това в терминал#пробвайте това в терминал>perl -e 'print "true\n" if "0" '>perl -e 'print "true\n" if "0" '>perl -e 'print "false\n" unless "0" '>perl -e 'print "false\n" unless "0" '>...>...

Page 11: Скаларни типове данни

Скаларни функции или оператори?

● Много от вградените функции в Perl често се наричат именувани оператори.

● Има няколко категории, в зависимост от употребата, типа данни (които се обработват или създават) и т.н.

● Например:– Функции за скалари или низове

– Числови функции

– Регулярни изрази и шаблони за съответствие...● Една функция/оператор може да попадне в една или

няколко категории, в зависимост от контекста.

Page 12: Скаларни типове данни

Операторът за присвояване

● Най-използваният оператор за скаларна (и масив или хеш) променлива е операторът за присвояване.

● По този начин ние задаваме стойност на променлива.

● По този начин ние даваме име на литерална (буквална) стойност.

my $name = 'Larry Wall';my $name = 'Larry Wall';print 'My name is ', $name, $/;print 'My name is ', $name, $/;

Page 13: Скаларни типове данни

Числови оператори

● Именувани оператори (функции), които обработват числа и произвеждат числа– abs, hex, oct

Page 14: Скаларни типове данни

Числови оператори

● abs VALUEabsВръща абсолютната стойност на аргумента си. Ако abs е без VALUE, използва $_.

● Виж perlfunc/abs

my $answer = -22;my $answer = -22;print abs $answer;print abs $answer;print abs "$answer";print abs "$answer";

Page 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';

Page 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', $/);

Page 17: Скаларни типове данни

Оператори за низ

● Именувани оператори (функции) за скалари или низове– length, chop and chomp, uc/lc

Page 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 'книга', $/);

Page 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 win32use 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) , $/);

Page 20: Скаларни типове данни

Оператори за низ● chomp VARIABLE

chomp( LIST )chompПо-сигурна версия на chop.

– Премахва последният символ, който съответства Премахва последният символ, който съответства на текущата стойност на $/, на текущата стойност на $/, от низаот низа..

– Връща общия брой на знаците, отстранени от Връща общия брой на знаците, отстранени от всичките му аргументи. всичките му аргументи.

#binmode(STDOUT, ':encoding(cp866)');#on win32#binmode(STDOUT, ':encoding(cp866)');#on win32use utf8; use utf8; binmode(STDOUT, ':utf8');binmode(STDOUT, ':utf8');my ($bob_latin, $bob_cyr) = ("bob\n", "боб$/");my ($bob_latin, $bob_cyr) = ("bob\n", "боб$/");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, $/ );

Page 21: Скаларни типове данни

Оператори за низ● lc EXPR

lcВръща вариант на EXPR с малки букви. Ако EXPR не е подаден, ползва $_.

● uc EXPRucВръща вариант на EXPR с главни букви. Ако EXPR не е подаден, ползва $_.

#binmode(STDOUT, ':encoding(cp866)');#on win32#binmode(STDOUT, ':encoding(cp866)');#on win32use utf8; use utf8; binmode(STDOUT, ':utf8');binmode(STDOUT, ':utf8');my ($lcstr, $ucstr) = ("BOB\n", "боб$/");my ($lcstr, $ucstr) = ("BOB\n", "боб$/");print( lc $lcstr, uc($ucstr), $/ );print( lc $lcstr, uc($ucstr), $/ );

Page 22: Скаларни типове данни

Не/дефинирани величини

● undef => нищо, празно, пусто● defined => нещо, което не е undef :)

Page 23: Скаларни типове данни

Не/дефинирани величини

● undef EXPRundef?Премахва стойността на 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 ,$/;

Page 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;

Page 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

Page 26: Скаларни типове данни

Операции за преобразуване на тип :X :(

● C оператори, липсващи в Perl:– Ооператор за преобразуване на типове

– ...

● От perlglossary:– Преобразуване на тип (Type casting): Превръщане

на данни от един тип в друг. C позволява това. Perl не се нуждае от него. Нито пък го иска.

Page 27: Скаларни типове данни

Референции (Препратки)

● Един скалар може още да съдържа референция.

● Референцията е просто парче данни, сочещо към друго парче данни (безименно или именувано).

● В Perl, една референция е винаги скалар, докато данните, към които сочи, може и да не са.

● Езици като C и C++ имат функционалност, подобна на референциите, наречена указатели (pointers).

● Указателите оставят на програмиста тълкуването на това, към което сочат.

● Референциите просто съдържат местоположенията на конкретни, ясно определени структури от данни – може и не предварително дефинирани, но дефинирани все пак.

● Референциите ви позволяват да оставите разпределението на компютърната памет на самия компютър.

Page 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 оператор. оператор.

Page 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);

Page 30: Скаларни типове данни

Скаларни типове данни

Въпроси?

С любезното съдействие на http://chainsolutions.net/

Page 31: Скаларни типове данни

Упражнения

1. Напишете програма, която превръща шестнайсетично число в десетично и го показва на екран.

2. Напишете програма, която показва абсолютната стойност на отрицателно число.

3. Напишете програма, която премахва последната буква от низ (без значение какъв е) и показва тази буква на екрана.

4. Напишете програма, която преобразува число в съответната му буква и показва буквата на екран.

5. Напишете програма, която отпечатва (print) низът 'Здрасти' три пъти на три отделни реда, като използвате само една конструкция за отпечатване.