SlideShare una empresa de Scribd logo
1 de 31
Descargar para leer sin conexión
Курс по
програмиране на 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) низът
'Здрасти' три пъти на три отделни реда, като използвате
само една конструкция за отпечатване.

Más contenido relacionado

La actualidad más candente

Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3DAVID Academy
 
Курс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSКурс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSDAVID Academy
 
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8DAVID Academy
 
Основни структури за управление на изчислителния процес
Основни структури за управление на изчислителния процесОсновни структури за управление на изчислителния процес
Основни структури за управление на изчислителния процесAtelier for robotics
 
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...DAVID Academy
 
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...DAVID Academy
 

La actualidad más candente (11)

Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14Училищен курс по програмиране на C# (2013/2014), занятие №14
Училищен курс по програмиране на C# (2013/2014), занятие №14
 
Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13Училищен курс по програмиране на C# (2013/2014), занятие №13
Училищен курс по програмиране на C# (2013/2014), занятие №13
 
OpenCamp Sofia
OpenCamp SofiaOpenCamp Sofia
OpenCamp Sofia
 
Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3
 
Курс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSКурс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSS
 
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
 
Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8Училищен курс по програмиране на C# (2013/2014), занятие №8
Училищен курс по програмиране на C# (2013/2014), занятие №8
 
Основни структури за управление на изчислителния процес
Основни структури за управление на изчислителния процесОсновни структури за управление на изчислителния процес
Основни структури за управление на изчислителния процес
 
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
 
Въведение в Python
Въведение в PythonВъведение в Python
Въведение в Python
 
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
 

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

BARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George PenkovBARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George PenkovSvetlin Nakov
 
18 operatori i funkcii
18 operatori i funkcii18 operatori i funkcii
18 operatori i funkciiIvan Peev
 
5. vb promenlivi
5. vb promenlivi5. vb promenlivi
5. vb promenlividnaidenowa
 
Redis by Svilen Ivanov
Redis by Svilen IvanovRedis by Svilen Ivanov
Redis by Svilen Ivanovit-tour
 
Nakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroNakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroSvetlin Nakov
 

Similar a Скаларни типове данни (8)

B7 t7 arrays
B7 t7 arraysB7 t7 arrays
B7 t7 arrays
 
B7 t7 arrays
B7 t7 arraysB7 t7 arrays
B7 t7 arrays
 
BARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George PenkovBARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George Penkov
 
Sed and awk
Sed and awkSed and awk
Sed and awk
 
18 operatori i funkcii
18 operatori i funkcii18 operatori i funkcii
18 operatori i funkcii
 
5. vb promenlivi
5. vb promenlivi5. vb promenlivi
5. vb promenlivi
 
Redis by Svilen Ivanov
Redis by Svilen IvanovRedis by Svilen Ivanov
Redis by Svilen Ivanov
 
Nakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroNakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - Intro
 

Más de Krasimir Berov (Красимир Беров) (12)

System Programming and Administration
System Programming and AdministrationSystem Programming and Administration
System Programming and Administration
 
Network programming
Network programmingNetwork programming
Network programming
 
Processes and threads
Processes and threadsProcesses and threads
Processes and threads
 
Working with databases
Working with databasesWorking with databases
Working with databases
 
Working with text, Regular expressions
Working with text, Regular expressionsWorking with text, Regular expressions
Working with text, Regular expressions
 
Subroutines
SubroutinesSubroutines
Subroutines
 
IO Streams, Files and Directories
IO Streams, Files and DirectoriesIO Streams, Files and Directories
IO Streams, Files and Directories
 
Syntax
SyntaxSyntax
Syntax
 
Hashes
HashesHashes
Hashes
 
Lists and arrays
Lists and arraysLists and arrays
Lists and arrays
 
Scalar data types
Scalar data typesScalar data types
Scalar data types
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perl
 

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

  • 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, $/;
  • 13. Числови оператори ● Именувани оператори (функции), които обработват числа и произвеждат числа – abs, hex, oct
  • 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), $/ );
  • 22. Не/дефинирани величини ● undef => нищо, празно, пусто ● defined => нещо, което не е undef :)
  • 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);
  • 30. Скаларни типове данни Въпроси? С любезното съдействие на http://chainsolutions.net/
  • 31. Упражнения 1. Напишете програма, която превръща шестнайсетично число в десетично и го показва на екран. 2. Напишете програма, която показва абсолютната стойност на отрицателно число. 3. Напишете програма, която премахва последната буква от низ (без значение какъв е) и показва тази буква на екрана. 4. Напишете програма, която преобразува число в съответната му буква и показва буквата на екран. 5. Напишете програма, която отпечатва (print) низът 'Здрасти' три пъти на три отделни реда, като използвате само една конструкция за отпечатване.