Хешове

16

Click here to load reader

description

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

Transcript of Хешове

Page 1: Хешове

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

ХешовеХешове

I-can.eu

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

Page 2: Хешове

ХешовеХешове

Page 3: Хешове

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

1.1. Какво е хеш?Какво е хеш?

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

3.3. Работа с елементите на хеша (exists, Работа с елементите на хеша (exists, delete, defined)delete, defined)

4.4. Други функции за работа с хешовеДруги функции за работа с хешове

Page 4: Хешове

Какво е хеш?Какво е хеш?

• Хешът представлява набор от двойки Хешът представлява набор от двойки ключ/стойностключ/стойност

• Ключовете в един хеш не са предварително Ключовете в един хеш не са предварително декларирани. Ако ключът не съществува по декларирани. Ако ключът не съществува по време на ПРИСВОЯВАНЕТО, то той се създава и време на ПРИСВОЯВАНЕТО, то той се създава и приема присвоената стойност.приема присвоената стойност.

• Името на променливата хеш се състои от знака за Името на променливата хеш се състои от знака за процент (%), следван от буква, след това нула процент (%), следван от буква, след това нула или повече букви, цифри и долни черти.или повече букви, цифри и долни черти.

my %fruit_colors = (my %fruit_colors = ( apple => "red",apple => "red", banana => "yellow",banana => "yellow",););

Page 5: Хешове

Представяне на хешПредставяне на хеш• Не съществува литерално представяне на един хеш, Не съществува литерално представяне на един хеш,

вместо това хешът се представя като списък. вместо това хешът се представя като списък.

• Всяка двойка елементи в списъка дефинира ключ и Всяка двойка елементи в списъка дефинира ключ и съответната му стойност. Това представяне може да съответната му стойност. Това представяне може да бъде присвоено на променлива от тип бъде присвоено на променлива от тип хеш , която хеш , която след това ще пресъздаде същия хеш. след това ще пресъздаде същия хеш.

Пример:Пример:

use Data::Dumper; $\ =$/;use Data::Dumper; $\ =$/;my my %fruit_colors%fruit_colors = = ('apple', 'red', 'banana', 'yellow')('apple', 'red', 'banana', 'yellow');;print Dumper(\%fruit_colors);print Dumper(\%fruit_colors);my @fruit_colors = %fruit_colors;my @fruit_colors = %fruit_colors;print Dumper(\@fruit_colors);print Dumper(\@fruit_colors);%fruit_colors = @fruit_colors;%fruit_colors = @fruit_colors;$fruit_colors{pear} = 'yellow';#add a key/value pair$fruit_colors{pear} = 'yellow';#add a key/value pairprint Dumper(\%fruit_colors);print Dumper(\%fruit_colors);

Page 6: Хешове

Работа с елементите на хешаРабота с елементите на хеша

• existsexists

• defineddefined

• deletedelete

Page 7: Хешове

Работа с елементите на хешаРабота с елементите на хеша• exists EXPRexists EXPR

В израз, който указва елемент от хеш или масив, В израз, който указва елемент от хеш или масив, връща истина, ако посоченият елемент някога е връща истина, ако посоченият елемент някога е бил инициализиран, дори ако съответната бил инициализиран, дори ако съответната стойност е недефинирана.стойност е недефинирана.Елементът не се създава автоматично, в случай Елементът не се създава автоматично, в случай че не съществува. че не съществува.

my %f_colors = ('apple', 'red', 'banana', 'yellow');my %f_colors = ('apple', 'red', 'banana', 'yellow');my @f_colors = %f_colors;my @f_colors = %f_colors;exists $f_colors[0] andexists $f_colors[0] and print $f_colors[0] .' exists';print $f_colors[0] .' exists';exists $f_colors{'apple'} andexists $f_colors{'apple'} and print ' and is '.$f_colors{'apple'};print ' and is '.$f_colors{'apple'};print 'Ops... 'print 'Ops... ' .$f_colors[0].' is '.$f_colors{$f_colors[0]};.$f_colors[0].' is '.$f_colors{$f_colors[0]};

Page 8: Хешове

Работа с елементите на хешаРабота с елементите на хеша

• defined EXPRdefined EXPR• Връща Булева стойност, указваща дали EXPR има Връща Булева стойност, указваща дали EXPR има

стойност, различна от недефинираната стойност стойност, различна от недефинираната стойност undefundef......

• Когато обработва елемент от хеш, указва дали Когато обработва елемент от хеш, указва дали стойността е дефинирана, а не дали този ключ е в стойността е дефинирана, а не дали този ключ е в хеша. За да разберете дали ключа съществува хеша. За да разберете дали ключа съществува ползвайте ползвайте exists.exists.

my %f_colors = ('apple', 'red', 'banana', 'yellow');my %f_colors = ('apple', 'red', 'banana', 'yellow');my @f_colors = %f_colors;my @f_colors = %f_colors;defined $f_colors[0] anddefined $f_colors[0] and print $f_colors[0] .' defined';print $f_colors[0] .' defined';defined $f_colors{'apple'} anddefined $f_colors{'apple'} and print ' and is '.$f_colors{'apple'};print ' and is '.$f_colors{'apple'};#...#...

Page 9: Хешове

Работа с елементите на хешаРабота с елементите на хеша

• delete EXPRdelete EXPR• В израз, който определя елемент или отрязък от В израз, който определя елемент или отрязък от

хеш или масив, изтрива посочения елемент (или хеш или масив, изтрива посочения елемент (или елементи) от хеша или масива... елементи) от хеша или масива...

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

• В скаларен контекст, връща стойността на В скаларен контекст, връща стойността на последния изтрит елемент (или недефинираната последния изтрит елемент (или недефинираната стойност, ако този елемент не съществува).стойност, ако този елемент не съществува).Виж: perlfunc/deleteВиж: perlfunc/delete

Page 10: Хешове

Работа с елементите на хешаРабота с елементите на хеша

• delete (Пример)delete (Пример)

my %f_colors = ('apple', 'red', 'banana', 'yellow');my %f_colors = ('apple', 'red', 'banana', 'yellow');my @f_colors = %f_colors;my @f_colors = %f_colors;push @f_colors,('pear','yellow');push @f_colors,('pear','yellow');%f_colors = @f_colors;%f_colors = @f_colors;print Dumper \@f_colors;print Dumper \@f_colors;print Dumper \%f_colors;print Dumper \%f_colors;print delete $f_colors[-1];print delete $f_colors[-1];print delete @f_colors{qw(apple banana)};print delete @f_colors{qw(apple banana)};print 'after delete:';print 'after delete:';print Dumper \%f_colors;print Dumper \%f_colors;print Dumper \@f_colors;print Dumper \@f_colors;

Page 11: Хешове

Други функции за работа Други функции за работа с хешс хеш

• eacheach

• keyskeys

• valuesvalues

Page 12: Хешове

Други функции за хешДруги функции за хеш

• each HASHeach HASH• Когато е извикан в списъчен контекст, връща Когато е извикан в списъчен контекст, връща

двуелементен списък, състоящ се от ключ и стойност двуелементен списък, състоящ се от ключ и стойност на следващия елемент от хеша, така че можете да го на следващия елемент от хеша, така че можете да го обхождате (итерация).обхождате (итерация).

• Когато е извикан в скаларен контекст, връща само Когато е извикан в скаларен контекст, връща само ключа на следващия елемент от хеша.ключа на следващия елемент от хеша.

• Записите се връщат в привидно произволен ред. Записите се връщат в привидно произволен ред.

• Но този произволен ред е в действителност същият Но този произволен ред е в действителност същият ред, какъвто функцията ред, какъвто функцията keyskeys или или valuesvalues биха биха направили в същия този (немодифициран) хеш.направили в същия този (немодифициран) хеш.

while (($key,$value) = each %ENV) {while (($key,$value) = each %ENV) { print "$key=>$value\n";print "$key=>$value\n";}}

Page 13: Хешове

Други функции за хешДруги функции за хеш

• keys HASHkeys HASHВръща списък, който се състои от Връща списък, който се състои от всички ключове на съответния хеш. (В всички ключове на съответния хеш. (В скаларен контекст, връща броя на скаларен контекст, връща броя на ключовете.) ключовете.)

#sorted by key#sorted by keyforeach $key (sort(keys %ENV)) {foreach $key (sort(keys %ENV)) { print $key, ' => ', $ENV{$key}, "\n";print $key, ' => ', $ENV{$key}, "\n";}}

Page 14: Хешове

Други функции за хешДруги функции за хеш

• values HASHvalues HASH

• Връща списък, който се състои от всички Връща списък, който се състои от всички стойности на съответния хеш. (В скаларен стойности на съответния хеш. (В скаларен контекст, връща броя на стойностите.)контекст, връща броя на стойностите.)

• Има само един итератор (шаблон) за всеки Има само един итератор (шаблон) за всеки хеш, който се ползва при всяко извикване на хеш, който се ползва при всяко извикване на eacheach, , keyskeys и и valuesvalues, програмата, програмата..

#sorted by value#sorted by valueforeach my $value (sort(values %ENV)) {foreach my $value (sort(values %ENV)) { print $value, "\n";print $value, "\n";}}

Page 15: Хешове

ХешовеХешове

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

Page 16: Хешове

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