Списъци и масиви

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

Upload: krasimir-berov

Post on 11-Jun-2015

137 views

Category:

Software


1 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Списъци и масиви

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

Списъци и масивиСписъци и масиви

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

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

Page 2: Списъци и масиви

СъдържаниеСъдържание

1.1. Какво е Списък или Масив?Какво е Списък или Масив?

2.2. ПредставянеПредставяне

• ЛитералиЛитерали

• ПроменливиПроменливи

3.3. Интерполация на масивиИнтерполация на масиви

4.4. Добавяне и премахване на елементиДобавяне и премахване на елементи

5.5. Оператори и функции за списъци и Оператори и функции за списъци и масивимасиви

6.6. Отрязъци от масивиОтрязъци от масиви

Page 3: Списъци и масиви

Какво е Списък или Масив?Какво е Списък или Масив?• Списъкът представлява подредени скаларни Списъкът представлява подредени скаларни

данни.данни.

• Масивът Масивът ee променливапроменлива, , коятокоято съдържасъдържа списък.списък.

• Всеки елемент от масива е отделна скаларна Всеки елемент от масива е отделна скаларна променлива със собствена променлива със собствена скаларнаскаларна стойност.стойност.

• Масивите могат да имат произволен брой Масивите могат да имат произволен брой елементи.елементи.

• Най-малкият масив няма елементи, докато Най-малкият масив няма елементи, докато най-големият може да запълни цялата най-големият може да запълни цялата налична памет. налична памет.

Page 4: Списъци и масиви

• Един буквален списък се състои от Един буквален списък се състои от разделени със запетаи скаларни стойности, разделени със запетаи скаларни стойности, обградени със скоби.обградени със скоби.

• Елементите на списъка могат да бъдат и Елементите на списъка могат да бъдат и изрази.изрази.

(1, 4.5, 15, 32 ) #списък от четири числови стойности(1, 4.5, 15, 32 ) #списък от четири числови стойности('me', 'you', 'us') #списък от три ниизови стойности('me', 'you', 'us') #списък от три ниизови стойности('me',15,'you',32) #списък от различни стойности('me',15,'you',32) #списък от различни стойности

(1, 4.5+15, $family=2 )#списък от изрази:(1, 4.5+15, $family=2 )#списък от изрази: #1, резултатът от 4.5+15#1, резултатът от 4.5+15 # и стойността на $family# и стойността на $family

Буквално Буквално ПредставянеПредставяне

Page 5: Списъци и масиви

• Празен списък (без елементи) се представя с две Празен списък (без елементи) се представя с две скобискоби

• Елемент от буквален списък може да бъде Елемент от буквален списък може да бъде включително и операторът за включително и операторът за създаване на списъксъздаване на списък, , означен чрез две скаларни стойности, разделени от означен чрез две скаларни стойности, разделени от двоеточие “двоеточие “....”.”.

• Този оператор създава списък от стойности, като Този оператор създава списък от стойности, като започва от лявата скаларна стойност и увеличава започва от лявата скаларна стойност и увеличава всеки следващ елемент с едно, докато достигне всеки следващ елемент с едно, докато достигне стойността отдясно.стойността отдясно.

() #празен списък (нула елемента)() #празен списък (нула елемента)

$, = $/; #$OUTPUT_FIELD_SEPARATOR сега е '\n'$, = $/; #$OUTPUT_FIELD_SEPARATOR сега е '\n'print (1..100);print (1..100);

Буквално Буквално ПредставянеПредставяне

Page 6: Списъци и масиви

• qw/STRING/qw/STRING/

• Създава списък от STRING, като използва Създава списък от STRING, като използва вградени интервали за разделители на вградени интервали за разделители на думите.думите.

• Създава списък по време на компилирането, Създава списък по време на компилирането, и в скаларен контекст връща последния и в скаларен контекст връща последния елемент от списъка.елемент от списъка.

$\=$/; #$OUTPUT_RECORD_SEPARATOR сега е "\n"$\=$/; #$OUTPUT_RECORD_SEPARATOR сега е "\n"$,=$/; #$OUTPUT_FIELD_SEPARATOR сега е "\n"$,=$/; #$OUTPUT_FIELD_SEPARATOR сега е "\n"print qw{me you us};print qw{me you us};print ('me', 'you', 'us'); # също като горнотоprint ('me', 'you', 'us'); # също като горното$аз = qw(аз ти ние);$аз = qw(аз ти ние);print $аз; # отпечатва 'ние'print $аз; # отпечатва 'ние'

Буквално Буквално ПредставянеПредставяне

Page 7: Списъци и масиви

ПроменливиПроменливи• Променливата масив съдържа само един Променливата масив съдържа само един

списък (нула или повече скаларни стойности).списък (нула или повече скаларни стойности).

• Стойността на една променлива масив, която Стойността на една променлива масив, която още не е определена, е (), т.е. празен списък.още не е определена, е (), т.е. празен списък.

• Цели масиви (както и отрязъците от масиви и Цели масиви (както и отрязъците от масиви и хешове) се обозначават с '@'.хешове) се обозначават с '@'.

• Дължината на един масив не е предварително Дължината на един масив не е предварително зададена. Perl автоматично си добавя зададена. Perl автоматично си добавя необходимото пространство.необходимото пространство.

Page 8: Списъци и масиви

ПроменливиПроменливи

• ПримерПример

$, = $\ = $/;$, = $\ = $/;my @numbers = (1, 4.5, 15, 32 );my @numbers = (1, 4.5, 15, 32 );my @family = ('me', 'you', 'us');my @family = ('me', 'you', 'us');print @family,$/;print @family,$/;$family[3] = 'he';$family[3] = 'he';print @family,$/;print @family,$/;my @things = (@numbers, @family);#сплесканmy @things = (@numbers, @family);#сплесканmy @predators = qw/leopard tiger panther/;my @predators = qw/leopard tiger panther/;my @slices = (1..3, A..D);my @slices = (1..3, A..D);print $/;print $/;print @numbers,@family,@things,@slices,@predators;print @numbers,@family,@things,@slices,@predators;

Page 9: Списъци и масиви

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

• Масивите могат да бъдат поставяни Масивите могат да бъдат поставяни (подобно на скаларите) в низ, обграден от (подобно на скаларите) в низ, обграден от двойни кавички.двойни кавички.

• Елементите на един масив са скалари и също Елементите на един масив са скалари и също могат да бъдат интерполирани.могат да бъдат интерполирани.

$\ = $/;$\ = $/;my @numbers = (1, 4.5, 15, 32 );my @numbers = (1, 4.5, 15, 32 );my @family = ('me', 'you', 'us');my @family = ('me', 'you', 'us');

print "Do $family[1] have $numbers[2] leva?";print "Do $family[1] have $numbers[2] leva?";print "Sorry, I do have $family[0] only.";print "Sorry, I do have $family[0] only.";$"=', ';#$LIST_SEPARATOR$"=', ';#$LIST_SEPARATORprint "O... @family... who cares!";print "O... @family... who cares!";

Page 10: Списъци и масиви

• оператори: оператори:

• pushpush

• poppop

• shiftshift

• unshiftunshift

• splicesplice

Добавяне и премахване на елементиДобавяне и премахване на елементи

Page 11: Списъци и масиви

• push ARRAY,LISTpush ARRAY,LIST

• Приема ARRAY като един куп (стек), и добавя Приема ARRAY като един куп (стек), и добавя стойностите от LIST на края на ARRAY. стойностите от LIST на края на ARRAY.

• Дължината на ARRAY нараства с дължината на Дължината на ARRAY нараства с дължината на LIST. LIST.

• Връща броя на елементите в масива след Връща броя на елементите в масива след добавянето. добавянето.

use Data::Dumper; use Data::Dumper; $\ = $/;$\ = $/;my @family = qw ( me you us );my @family = qw ( me you us );print scalar @family;#отпечатва броя на елементите (3)print scalar @family;#отпечатва броя на елементите (3)print push(@family, qw ( him her ));print push(@family, qw ( him her ));#5#5print Dumper \@family;print Dumper \@family;

Добавяне и премахване на елементиДобавяне и премахване на елементи

Page 12: Списъци и масиви

• pop ARRAYpop ARRAYpoppop• Отстранява най-горния (последния) елемент от Отстранява най-горния (последния) елемент от

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

• Ако масивът е празен, връща недефинирана Ако масивът е празен, връща недефинирана стойност. стойност.

• Ако ARRAY Ако ARRAY не е подаденне е подаден, премахва от масива , премахва от масива @ARGV в главната програма и от масива @_ в @ARGV в главната програма и от масива @_ в подпрограмите, точно като оператора shift.подпрограмите, точно като оператора shift.

use Data::Dumper; use Data::Dumper; $\ =$/;$\ =$/;my @names = qw ( Цвети Бети Пешо );my @names = qw ( Цвети Бети Пешо );my $last_name = pop(@names);my $last_name = pop(@names);warn "popped = $last_name";warn "popped = $last_name";print Dumper \@names;print Dumper \@names;

Добавяне и премахване на елементиДобавяне и премахване на елементи

Page 13: Списъци и масиви

• shift ARRAYshift ARRAYshiftshift• Отстранява първата стойност от масива и я връща, Отстранява първата стойност от масива и я връща,

като скъсява масива с един елемент и измества като скъсява масива с един елемент и измества всичко надолу.всичко надолу.

• Ако в масива няма елементи, връща недефинирана Ако в масива няма елементи, връща недефинирана стойност.стойност.

• Ако ARRAY Ако ARRAY не е подаденне е подаден, отстранява от масива @_ в , отстранява от масива @_ в лексикалния обхват на подпрограмите и форматите, лексикалния обхват на подпрограмите и форматите, както и от масива @ARGV извън подпрограма... както и от масива @ARGV извън подпрограма...

use Data::Dumper;$\ =$/;use Data::Dumper;$\ =$/;my @names = qw ( Цвети Бети Пешо );my @names = qw ( Цвети Бети Пешо );my $last_name = shift(@names);my $last_name = shift(@names);warn "shifted = $last_name";warn "shifted = $last_name";print Dumper \@names;print Dumper \@names;

Добавяне и премахване на елементиДобавяне и премахване на елементи

Page 14: Списъци и масиви

Добавяне и премахване на елементиДобавяне и премахване на елементи

• unshift ARRAY,LISTunshift ARRAY,LIST

• Прави обратното на shift. Или обратното на push. Прави обратното на shift. Или обратното на push. В зависимост от гледната точка.В зависимост от гледната точка.

• Добавя LIST в началото на масива, и връща новия Добавя LIST в началото на масива, и връща новия брой на елементите от масива.брой на елементите от масива.

• Забележете, че списъкът се добавя целия, а не Забележете, че списъкът се добавя целия, а не елемент по елемент, така че добавените елементи елемент по елемент, така че добавените елементи запазват досегашния си ред.запазват досегашния си ред.

use Data::Dumper; $\ =$/;use Data::Dumper; $\ =$/;my @names = qw ( Цвети Бети Пешо );my @names = qw ( Цвети Бети Пешо );print 'elements:', scalar @names;print 'elements:', scalar @names;print 'elements:', unshift(@names,qw/Део Иво/);print 'elements:', unshift(@names,qw/Део Иво/);print Dumper \@names;print Dumper \@names;

Page 15: Списъци и масиви

• splice ARRAY,OFFSET,LENGTH,LISTsplice ARRAY,OFFSET,LENGTH,LIST

• Премахва елементите, определени от OFFSET и Премахва елементите, определени от OFFSET и LENGTH, и ги замества с елементите от LIST, ако LENGTH, и ги замества с елементите от LIST, ако има такива.има такива.

• В списъчен контекст, връща елементите, В списъчен контекст, връща елементите, премахнати от масива. премахнати от масива.

• В скаларен контекст, връща последния премахнат В скаларен контекст, връща последния премахнат елемент, или недефинирана стойност, ако не са елемент, или недефинирана стойност, ако не са премахнати никакви елементи.премахнати никакви елементи.

• Масивът расте или се свива, колкото е Масивът расте или се свива, колкото е необходимо.необходимо.

my @words = qw ( hello there );my @words = qw ( hello there );splice(@words, 1, 0, 'out');splice(@words, 1, 0, 'out');print join(" ", @words);print join(" ", @words);

Добавяне и премахване на елементиДобавяне и премахване на елементи

Page 16: Списъци и масиви

Оператори и функции за Оператори и функции за списъци и масивисписъци и масиви

• foreachforeach

• joinjoin

• mapmap

• grepgrep

Page 17: Списъци и масиви

Оператори и функции за списъци Оператори и функции за списъци и масивии масиви

• foreach (@array)foreach (@array)

• foreachforeach се използва за обхождане (итерация) на всички се използва за обхождане (итерация) на всички елементи от списък. Официалното му определение е:елементи от списък. Официалното му определение е:

LABEL foreach VAR (LIST) BLOCKLABEL foreach VAR (LIST) BLOCKТова е структура за контрол на потока.Това е структура за контрол на потока.

• Структурата Структурата foreachforeach поддържа конструкциите поддържа конструкциите lastlast, , nextnext и и redoredo. Използвайте прост . Използвайте прост foreachforeach цикъл да цикъл да направите нещо с всеки елемент от масива.направите нещо с всеки елемент от масива.

• НЕ ДОБАВЯЙТЕ И НЕ ПРЕМАХВАЙТЕ ЕЛЕМЕНТИ ОТ НЕ ДОБАВЯЙТЕ И НЕ ПРЕМАХВАЙТЕ ЕЛЕМЕНТИ ОТ МАСИВ, ДОКАТО СЕ ОБРАБОТВА ОТ МАСИВ, ДОКАТО СЕ ОБРАБОТВА ОТ foreachforeach ЦИКЪЛ. ЦИКЪЛ.

my @fruits = qw ( apples oranges lemons pears );my @fruits = qw ( apples oranges lemons pears );foreach my $fruit (@fruits) {foreach my $fruit (@fruits) { print "fruit is '$fruit'\n"; print "fruit is '$fruit'\n"; }}

Page 18: Списъци и масиви

Оператори и функции за списъци Оператори и функции за списъци и масивии масиви

• join EXPR,LISTjoin EXPR,LIST

• Съединява отделни низове от LIST в Съединява отделни низове от LIST в единичен низ с полета, разделени от единичен низ с полета, разделени от стойността на EXPR, и връща този нов низ. стойността на EXPR, и връща този нов низ.

my @fields = qw ( id name position );my @fields = qw ( id name position );my $SQL = 'SELECT 'my $SQL = 'SELECT ' . join(", ", @fields). join(", ", @fields) . ' from empoyees';. ' from empoyees';print $SQL;print $SQL;

Page 19: Списъци и масиви

Оператори и функции за списъци Оператори и функции за списъци и масивии масиви

• map BLOCK LISTmap BLOCK LISTmap EXPR,LISTmap EXPR,LIST• Изчислява BLOCK или EXPR за всеки елемент от Изчислява BLOCK или EXPR за всеки елемент от

LIST (локално определя $_ за всеки елемент) иLIST (локално определя $_ за всеки елемент) и връща списък със стойности, съставен от връща списък със стойности, съставен от резултатите от всяко едно изчисление.резултатите от всяко едно изчисление.

• В скаларен контекст – връща общия брой на така В скаларен контекст – връща общия брой на така получените елементи.получените елементи.

• В списъчен контекст – проверява BLOCK или EXPR, В списъчен контекст – проверява BLOCK или EXPR, така че всеки елемент от LIST може да произведе така че всеки елемент от LIST може да произведе нула, един или повече елементи като върната нула, един или повече елементи като върната стойност. стойност.

• Имайте предвид, че $_ е псевдоним на стойността Имайте предвид, че $_ е псевдоним на стойността от списъка, така че с него може да се променят от списъка, така че с него може да се променят елементите на LIST. Виж perlfunc/map.елементите на LIST. Виж perlfunc/map.

Page 20: Списъци и масиви

Оператори и функции за списъци Оператори и функции за списъци и масивии масиви

• map Пример:map Пример:

binmode STDOUT,":utf8";binmode STDOUT,":utf8";my @nums = (0x410 .. 0x44f);my @nums = (0x410 .. 0x44f);my @chars = map(chr , @nums);my @chars = map(chr , @nums);print @chars;print @chars;

print '-' x 20;print '-' x 20;my @names = qw(Цвети Пешо Иван);my @names = qw(Цвети Пешо Иван);my @mapped = map {$_ if $_ eq 'Пешо'} @names;my @mapped = map {$_ if $_ eq 'Пешо'} @names;print @mapped;print @mapped;

Page 21: Списъци и масиви

Оператори и функции за списъци Оператори и функции за списъци и масивии масиви

• grep BLOCK LISTgrep BLOCK LISTgrep EXPR,LISTgrep EXPR,LIST• Изчислява BLOCK или EXPR за всеки елемент от Изчислява BLOCK или EXPR за всеки елемент от

LIST (локално определя $_ за всеки елемент) иLIST (локално определя $_ за всеки елемент) и връща списък със стойности, съдържащ тези връща списък със стойности, съдържащ тези елементи, за които изразът е върнал „истина“елементи, за които изразът е върнал „истина“. .

• В скаларен контекст – връща броя на случаите, в В скаларен контекст – връща броя на случаите, в които изразът е бил истина. които изразът е бил истина.

• Имайте предвид, че $_ е псевдоним на стойността Имайте предвид, че $_ е псевдоним на стойността от списъка, така че с него може да се променят от списъка, така че с него може да се променят елементите на LIST. елементите на LIST.

• Виж perlfunc/grep.Виж perlfunc/grep.

Page 22: Списъци и масиви

Оператори и функции за списъци Оператори и функции за списъци и масивии масиви

• grep Пример:grep Пример:

my @nums = (0x410 .. 0x44f);my @nums = (0x410 .. 0x44f);my @chars = grep( my @chars = grep( ($_ >= 0x410 and $_ < 0x430), @nums($_ >= 0x410 and $_ < 0x430), @nums ););map($_ = chr, @chars);#modify inplace $_map($_ = chr, @chars);#modify inplace $_print @chars;print @chars;

#търсене на буквата 'а'#търсене на буквата 'а'if( my $times = grep { chr($_) =~ /а/i } @nums ){if( my $times = grep { chr($_) =~ /а/i } @nums ){ print "'а' codes found:print "'а' codes found: $times times in the list."$times times in the list."}}

Page 23: Списъци и масиви

Отрязъци от масивиОтрязъци от масиви

• Оператор за поредици (..)Оператор за поредици (..)• В списъчен контекст – връща списък със В списъчен контекст – връща списък със

стойности, изброявани една по една от лявата стойности, изброявани една по една от лявата стойност към дясната стойност.стойност към дясната стойност.

• Ако лявата стойност е по-голяма от дясната, Ако лявата стойност е по-голяма от дясната, връща празен списък. връща празен списък.

• Операторът за поредици е полезен за писане на Операторът за поредици е полезен за писане на foreach (1..10)foreach (1..10) цикли и за взимане на отрязъци цикли и за взимане на отрязъци от масиви. от масиви.

• Операторът за поредици не създава временен Операторът за поредици не създава временен масив когато се използва във foreach цикъл.масив когато се използва във foreach цикъл.

• Виж: perlop/Range Operators, perldata/SlicesВиж: perlop/Range Operators, perldata/Slices

Page 24: Списъци и масиви

• Оператор за поредици (..)Оператор за поредици (..)

• ПримерПример

my @nums = (0x410 .. 0x44f);my @nums = (0x410 .. 0x44f);print chr($nums[$_]) foreach(0..14);print chr($nums[$_]) foreach(0..14);#отпечатва отрязък#отпечатва отрязъкprint @nums[0..14],$/;print @nums[0..14],$/;#print a character map table from slice#print a character map table from sliceprint ' dec | hex | char', '-' x 19;print ' dec | hex | char', '-' x 19;print map {print map { $_.' | '$_.' | ' . sprintf('0x%x',$_).' | '.chr($_). sprintf('0x%x',$_).' | '.chr($_) . "\n" . '-' x 19. "\n" . '-' x 19} @nums[0..14];} @nums[0..14];

Отрязъци от масивиОтрязъци от масиви

Page 25: Списъци и масиви

Списъци и масивиСписъци и масиви

Въпроси?Въпроси?

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

Page 26: Списъци и масиви

УпражненияУпражнения

• TODOTODO