dzgn&concpt::jr*
 



Набор примери за хешове
  


Пример 0

 

Демонстрира стандартните начини за дефиниране и модифициране на асоциативе масив (хеш).
 

source code ( example.0.pl ) output

#!/usr/bin/perl

# Празен асоциативен списък (хеш)
%hash = ();
print %hash, "\n";

%hash = ('one' => 1, 'two' => 2);
# print извежда един след друг ключовите двойки на хеша
print %hash, "\n";

# Хешовете могат да се дефинират като списъци, като
# четните елементи са стойностите, а нечетните -
# ключове

%hash = qw {one 1 two 2};

print %hash, "\n";

$hash{three} = 3;
print %hash, "\n";

print $hash{three};

one1two2
one1two2
one1three3two2
3

 

 

Пример 1

 

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

source code ( example.1.pl ) output
#!/usr/bin/perl

# Хешовете също могат да се дефинират като списъци
%byKey = qw { kon vinovnik treva 100kila pase 3h };

%byValue = reverse %byKey;
print "\n 100 kila vkusna ".$byValue{'100kila'}.
"\n hapva s pxlna sila vinovniq ".$byValue{'vinovnik'};

100 kila vkusna treva
hapva s pxlna sila vinovniq kon

 

Пример 2

 

Примерът демонстрира операторите keys, values, exists и delete. Първите два връщат ключовете и съответните им стойности като списъци (като на 0-ия елемент в списъка с ключове отговаря 0-бият елемент в списъка със стойности и т.н. В същия момент наредбата може да се различава при отделни извиквания, но съответствието се запзва). exists връща true, ако съществува елемент със съотвтния ключ, а delete премахва елемент от асоциативен списък.

 

source code ( example.2.pl ) output
#!/usr/bin/perl


%hash = qw { kurs perl fakultet fmi ocenka shest kolegi pichove kolejki macki };

print join ( ' ', keys %hash ) . "\n";
print join ( ' ', values %hash ) . "\n";
# int форсира print да изведе резултата от exists като число
print int exists $hash{'kolegi'};

print "\n";

delete $hash {'kolegi'};
# int форсира print да изведе резултата от exists като число
print int exists $hash{'kolegi'};

print "\n";

print join ( ' ', keys %hash ) . "\n";
print join ( ' ', values %hash ) . "\n";

print "\n";

kurs ocenka kolejki kolegi fakultet
perl shest macki pichove fmi
1
0
kurs ocenka kolejki fakultet
perl shest macki fmi

 

Пример 3

 

Демонстрира правилния подход за проверка на съществуването на даден елемент в асоциативен списък, както и за изтриването му. Хешовете могат да съдържат елементи със стойност undef, ето защо за проверка се използва exists, а не defined или пряко обръщение към елемента в булеви изрази, тъй като undef стойности се отчитат като false.
 

source code ( example.3.pl ) output

#!/usr/bin/perl

%hash = qw { kurs perl fakultet fmi ocenka shest kolegi pichove kolejki macki };

# Присвоява стойност 'undef' на елемента отговарящ на
# ключ 'kolegi'

undef $hash {'kolegi'};

print "defined returns:".(int defined $hash{'kolegi'});
print "\n";
print "exists returns:".(int exists $hash{'kolegi'});
print "\n";

# Изтрива елемента от хеша
delete $hash {'kolegi'};

print "defined returns:".(int defined $hash{'kolegi'});
print "\n";
print "exists returns:".(int exists $hash{'kolegi'});
print "\n";

defined returns:0
exists returns:1
defined returns:0
exists returns:0

 

 


Пример 4

 

Примерът показва подхода при проверка дали даден хеш е пълен или не при употребата му в скаларен контекст. Демонстрира се и начин за намиране броя на елементите в даден асоциативен масив, чрез разглездане на списъка генериран от keys в скаларен контекст.
 

source code ( example.4.pl ) output

#!/usr/bin/perl

# В скаларен контекст празният хеш връща false, # което може да се изпозлва за проверка дали
# даден хеш има поне един елемент

%hasho = ();
print scalar %hasho, "\n";

# Отпечатва недефинирани досега променливи
# При появата на такива те имат стойност undef,
# която в стрингов контекст е празният стринг

print "$numKeys ::: $elemsDispatch \n ";

%hasho = qw { vodka bueno vino perfecto laro di muhata leti };

# Взима броя на eлементите
$numKeys = scalar keys %hasho;
# При непразен хеш, показва разпределението
# на елементите в хеш таблицата

$elemsDispatch = scalar %hasho;

print "$numKeys ::: $elemsDispatch \n ";

0
:::
4 ::: 3/8

 


Пример 5

 

Примерът има за цел да демонстрира често използван метод за итерация върху всички елементи на асоциативен масив, като се ползва функцията each. Тя връща списък с двойка елементи - ключ и съответната стойност. При преминаване през всички елементи се връща празен списък, което в скаларен контекст при проверка на булево условие е false и дава възможност обхождането да стане с while цикъл.
 

 

source code ( example.5.pl ) output
#!/usr/bin/perl

%hash = qw { test stoinost dve tri };

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

dve => tri
test => stoinost

 



Пример 6

 

Последният пример демонстрира изпозлването на хешови отрязъци (slice-ове), подобни на отрязъците при масивите. Тук отново имаме индексиране по няколко ключа, като резултата е списък, ето защо пред асоциативните масиви тук се поставя '@', а не '%'.
 

source code ( example.6.pl ) output
#!/usr/bin/perl

%hash = qw { 1 uan 2 tu 3 tri 4 for 5 faiv };

# Чрез splice се взима списък от елементите с
# ключове 1, 3 и 5

print join ( ' ', @hash{qw { 1 3 5 }} ) . "\n";

# Отново чрез splice, индексирайки със всички
# ключове итерираме върху списък от всички
# стойности и ги променяме

foreach (@hash{keys %hash}) {
     $_ .= '!!!';
}
print join (' ', values %hash) . "\n";

# Бърз и кратък запис за промяна на множество
# от елементи чрез отрязък

@hash{ '6', '7', '4'} = ('six', 'seven', 'four');
print join (' ', values %hash) . "\n";

%new_hash = qw { 8 eight 9 nine 1 uno };
# Бърз начин за сливане на двата хеша в %hash
@hash{keys %new_hash} = values %new_hash;
print join (' ', values %hash) . "\n";

%hash = qw { 1 uan 2 tu 3 tri 4 for 5 faiv };
# Друг, по-кратък, но и по-бавен за изпълнение
# запис основаващ се на дефиницията на хеш,
# като списък

%hash = (%hash, %new_hash);
print join (' ', values %hash) . "\n";


uan tri faiv
uan!!! tu!!! tri!!! for!!! faiv!!!
seven uan!!! tu!!! tri!!! four faiv!!! six
uno tu!!! tri!!! four faiv!!! six seven eight nine
uno tu tri for faiv eight nine


Всичко това горе попада под ударите на Creative Commons License.
Задвижвано от
Movable Type 2.65

Най-добре се вижда с Firefox в 1024х768 или повече.