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

  • 80 views
Uploaded on

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

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

More in: Software
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
80
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Курс по програмиранеКурс по програмиране на Perlна Perl Списъци и масивиСписъци и масиви Автор: Красимир Беров, Превод: Теодора Берова I-can.eu С любезното съдействие на Chain Solutions
  • 2. СъдържаниеСъдържание 1.1. Какво е Списък или Масив?Какво е Списък или Масив? 2.2. ПредставянеПредставяне • ЛитералиЛитерали • ПроменливиПроменливи 3.3. Интерполация на масивиИнтерполация на масиви 4.4. Добавяне и премахване на елементиДобавяне и премахване на елементи 5.5. Оператори и функции за списъци иОператори и функции за списъци и масивимасиви 6.6. Отрязъци от масивиОтрязъци от масиви
  • 3. Какво е Списък или Масив?Какво е Списък или Масив? • Списъкът представлява подредени скаларниСписъкът представлява подредени скаларни данни.данни. • МасивътМасивът ee променливапроменлива,, коятокоято съдържасъдържа списък.списък. • Всеки елемент от масива е отделна скаларнаВсеки елемент от масива е отделна скаларна променлива със собственапроменлива със собствена скаларнаскаларна стойност.стойност. • Масивите могат да имат произволен бройМасивите могат да имат произволен брой елементи.елементи. • Най-малкият масив няма елементи, докатоНай-малкият масив няма елементи, докато най-големият може да запълни цялатанай-големият може да запълни цялата налична памет.налична памет.
  • 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 БуквалноБуквално ПредставянеПредставяне
  • 5. • Празен списък (без елементи) се представя с двеПразен списък (без елементи) се представя с две скобискоби • Елемент от буквален списък може да бъдеЕлемент от буквален списък може да бъде включително и операторът завключително и операторът за създаване на списъксъздаване на списък,, означен чрез две скаларни стойности, разделени отозначен чрез две скаларни стойности, разделени от двоеточие “двоеточие “....”.”. • Този оператор създава списък от стойности, катоТози оператор създава списък от стойности, като започва от лявата скаларна стойност и увеличавазапочва от лявата скаларна стойност и увеличава всеки следващ елемент с едно, докато достигневсеки следващ елемент с едно, докато достигне стойността отдясно.стойността отдясно. () #празен списък (нула елемента)() #празен списък (нула елемента) $, = $/; #$OUTPUT_FIELD_SEPARATOR сега е 'n'$, = $/; #$OUTPUT_FIELD_SEPARATOR сега е 'n' print (1..100);print (1..100); БуквалноБуквално ПредставянеПредставяне
  • 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 $аз; # отпечатва 'ние' БуквалноБуквално ПредставянеПредставяне
  • 7. ПроменливиПроменливи • Променливата масив съдържа само единПроменливата масив съдържа само един списък (нула или повече скаларни стойности).списък (нула или повече скаларни стойности). • Стойността на една променлива масив, коятоСтойността на една променлива масив, която още не е определена, е (), т.е. празен списък.още не е определена, е (), т.е. празен списък. • Цели масиви (както и отрязъците от масиви иЦели масиви (както и отрязъците от масиви и хешове) се обозначават с '@'.хешове) се обозначават с '@'. • Дължината на един масив не е предварителноДължината на един масив не е предварително зададена. Perl автоматично си добавязададена. Perl автоматично си добавя необходимото пространство.необходимото пространство.
  • 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;
  • 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_SEPARATOR print "O... @family... who cares!";print "O... @family... who cares!";
  • 10. • оператори:оператори: • pushpush • poppop • shiftshift • unshiftunshift • splicesplice Добавяне и премахване на елементиДобавяне и премахване на елементи
  • 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#5 print Dumper @family;print Dumper @family; Добавяне и премахване на елементиДобавяне и премахване на елементи
  • 12. • pop ARRAYpop ARRAY poppop • Отстранява най-горния (последния) елемент отОтстранява най-горния (последния) елемент от масива и го връща, като скъсява масива с единмасива и го връща, като скъсява масива с един елемент.елемент. • Ако масивът е празен, връща недефиниранаАко масивът е празен, връща недефинирана стойност.стойност. • Ако 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; Добавяне и премахване на елементиДобавяне и премахване на елементи
  • 13. • shift ARRAYshift ARRAY shiftshift • Отстранява първата стойност от масива и я връща,Отстранява първата стойност от масива и я връща, като скъсява масива с един елемент и измествакато скъсява масива с един елемент и измества всичко надолу.всичко надолу. • Ако в масива няма елементи, връща недефиниранаАко в масива няма елементи, връща недефинирана стойност.стойност. • Ако 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; Добавяне и премахване на елементиДобавяне и премахване на елементи
  • 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;
  • 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); Добавяне и премахване на елементиДобавяне и премахване на елементи
  • 16. Оператори и функции заОператори и функции за списъци и масивисписъци и масиви • foreachforeach • joinjoin • mapmap • grepgrep
  • 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"; }}
  • 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;
  • 19. Оператори и функции за списъциОператори и функции за списъци и масивии масиви • map BLOCK LISTmap BLOCK LIST map EXPR,LISTmap EXPR,LIST • Изчислява BLOCK или EXPR за всеки елемент отИзчислява BLOCK или EXPR за всеки елемент от LIST (локално определя $_ за всеки елемент) иLIST (локално определя $_ за всеки елемент) и връща списък със стойности, съставен отвръща списък със стойности, съставен от резултатите от всяко едно изчисление.резултатите от всяко едно изчисление. • В скаларен контекст – връща общия брой на такаВ скаларен контекст – връща общия брой на така получените елементи.получените елементи. • В списъчен контекст – проверява BLOCK или EXPR,В списъчен контекст – проверява BLOCK или EXPR, така че всеки елемент от LIST може да произведетака че всеки елемент от LIST може да произведе нула, един или повече елементи като върнатанула, един или повече елементи като върната стойност.стойност. • Имайте предвид, че $_ е псевдоним на стойносттаИмайте предвид, че $_ е псевдоним на стойността от списъка, така че с него може да се променятот списъка, така че с него може да се променят елементите на LIST. Виж perlfunc/map.елементите на LIST. Виж perlfunc/map.
  • 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;
  • 21. Оператори и функции за списъциОператори и функции за списъци и масивии масиви • grep BLOCK LISTgrep BLOCK LIST grep EXPR,LISTgrep EXPR,LIST • Изчислява BLOCK или EXPR за всеки елемент отИзчислява BLOCK или EXPR за всеки елемент от LIST (локално определя $_ за всеки елемент) иLIST (локално определя $_ за всеки елемент) и връща списък със стойности, съдържащ тезивръща списък със стойности, съдържащ тези елементи, за които изразът е върнал „истина“елементи, за които изразът е върнал „истина“.. • В скаларен контекст – връща броя на случаите, вВ скаларен контекст – връща броя на случаите, в които изразът е бил истина.които изразът е бил истина. • Имайте предвид, че $_ е псевдоним на стойносттаИмайте предвид, че $_ е псевдоним на стойността от списъка, така че с него може да се променятот списъка, така че с него може да се променят елементите на LIST.елементите на LIST. • Виж perlfunc/grep.Виж perlfunc/grep.
  • 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." }}
  • 23. Отрязъци от масивиОтрязъци от масиви • Оператор за поредици (..)Оператор за поредици (..) • В списъчен контекст – връща списък съсВ списъчен контекст – връща списък със стойности, изброявани една по една от ляватастойности, изброявани една по една от лявата стойност към дясната стойност.стойност към дясната стойност. • Ако лявата стойност е по-голяма от дясната,Ако лявата стойност е по-голяма от дясната, връща празен списък.връща празен списък. • Операторът за поредици е полезен за писане наОператорът за поредици е полезен за писане на foreach (1..10)foreach (1..10) цикли и за взимане на отрязъцицикли и за взимане на отрязъци от масиви.от масиви. • Операторът за поредици не създава времененОператорът за поредици не създава временен масив когато се използва във foreach цикъл.масив когато се използва във foreach цикъл. • Виж: perlop/Range Operators, perldata/SlicesВиж: perlop/Range Operators, perldata/Slices
  • 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 slice print ' 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]; Отрязъци от масивиОтрязъци от масиви
  • 25. Списъци и масивиСписъци и масиви Въпроси?Въпроси? С любезното съдействие на http://chainsolutions.net/
  • 26. УпражненияУпражнения • TODOTODO