Скаларни типове данни
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 182 views

Това е превод на български от Теодора Берова на втория урок от поредицата уроци, които водих преди време за ...

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

Statistics

Views

Total Views
182
Views on SlideShare
181
Embed Views
1

Actions

Likes
0
Downloads
0
Comments
0

1 Embed 1

https://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • Курс по програмиране на Perl Скаларни типове данниСкаларни типове данни Автор: Красимир Беров, Превод: Теодора Берова I-can.eu С любезното съдействие на Chain Solutions
  • Съдържание 1. Типове на променливите и данните в Perl 2. Числови оператори 3. Низови оператори 4. Скаларни функции (кратко изложение) 5. Недефинирани величини 6. Преобразуване на типове в Perl?! 7. Референции
  • Променливи/типове данни В Perl има три главни типа променливи: – скалари – масиви – хешове ... Плюс два допълнителни: – typeglobs (глобални типове) – файлови манипулатори Виж: perlintro, perldata
  • Имена на променливи ● Стойностите обикновено се означават с име, или чрез именувана препратка (референция). ● Първият знак указва вида/типа структура от данни ($,@,%). ● После е името на съответната стойност. ● Обикновено името е единичен идентификатор – низ, започващ с буква или долна черта, който може да съдържа букви, долни черти и цифри. ● Може да бъде също и поредица от идентификатори, разделени с :: (виж perlmod/Packages, perlref).
  • Скаларите в 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: ',$], $/;
  • Масивите в 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
  • Хешовете в 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"; #хешовете НЕ СЕ интерполират
  • Обратно към скаларите!..
  • Скаларни стойности ● Всяко парче данни в Perl е скалар, масив от скалари или хеш от скалари. ● Скаларът може да съдържа една единствена стойност, която да е: – Низ – Число – Референция (за това по-нататък) – Файлов манипулатор (друг път (I/O) ) ● Превръщането от един формат в друг е прозрачно (автоматично). ● По подразбиране, скаларните стойности са недефинирани.
  • Какво са скаларите (отново) ● Скаларът е единичен низ, число или препратка (референция) към нещо. ● Стойността на един скалар се приема за 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" ' >...>...
  • Скаларни функции или оператори? ● Много от вградените функции в Perl често се наричат именувани оператори. ● Има няколко категории, в зависимост от употребата, типа данни (които се обработват или създават) и т.н. ● Например: – Функции за скалари или низове – Числови функции – Регулярни изрази и шаблони за съответствие... ● Една функция/оператор може да попадне в една или няколко категории, в зависимост от контекста.
  • Операторът за присвояване ● Най-използваният оператор за скаларна (и масив или хеш) променлива е операторът за присвояване. ● По този начин ние задаваме стойност на променлива. ● По този начин ние даваме име на литерална (буквална) стойност. my $name = 'Larry Wall';my $name = 'Larry Wall'; print 'My name is ', $name, $/;print 'My name is ', $name, $/;
  • Числови оператори ● Именувани оператори (функции), които обработват числа и произвеждат числа – abs, hex, oct
  • Числови оператори ● 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";
  • Числови оператори ● 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';
  • Числови оператори ● 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', $/);
  • Оператори за низ ● Именувани оператори (функции) за скалари или низове – length, chop and chomp, uc/lc
  • Оператори за низ ● 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 'книга', $/);
  • Оператори за низ ● 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) , $/);
  • Оператори за низ ● 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, $/ );
  • Оператори за низ ● 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), $/ );
  • Не/дефинирани величини ● undef => нищо, празно, пусто ● defined => нещо, което не е undef :)
  • Не/дефинирани величини ● 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 ,$/;
  • Не/дефинирани величини ● 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;
  • Скаларни функции (обобщение) ● Функции за скалари или низове – 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
  • Операции за преобразуване на тип :X :( ● C оператори, липсващи в Perl: – Ооператор за преобразуване на типове – ... ● От perlglossary: – Преобразуване на тип (Type casting): Превръщане на данни от един тип в друг. C позволява това. Perl не се нуждае от него. Нито пък го иска.
  • Референции (Препратки) ● Един скалар може още да съдържа референция. ● Референцията е просто парче данни, сочещо към друго парче данни (безименно или именувано). ● В Perl, една референция е винаги скалар, докато данните, към които сочи, може и да не са. ● Езици като C и C++ имат функционалност, подобна на референциите, наречена указатели (pointers). ● Указателите оставят на програмиста тълкуването на това, към което сочат. ● Референциите просто съдържат местоположенията на конкретни, ясно определени структури от данни – може и не предварително дефинирани, но дефинирани все пак. ● Референциите ви позволяват да оставите разпределението на компютърната памет на самия компютър.
  • Референции ● 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 оператор.оператор.
  • Референции ● Пример ● Референциите ще бъдат обсъдени друг път 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);
  • Скаларни типове данни Въпроси? С любезното съдействие на http://chainsolutions.net/
  • Упражнения 1. Напишете програма, която превръща шестнайсетично число в десетично и го показва на екран. 2. Напишете програма, която показва абсолютната стойност на отрицателно число. 3. Напишете програма, която премахва последната буква от низ (без значение какъв е) и показва тази буква на екрана. 4. Напишете програма, която преобразува число в съответната му буква и показва буквата на екран. 5. Напишете програма, която отпечатва (print) низът 'Здрасти' три пъти на три отделни реда, като използвате само една конструкция за отпечатване.