Ініціалізація (очищення) хеша, Статті, Perl, статті

Найшвидший спосіб очищення – це присвоєння порожнього списку.


Реалізація

    my %hash = ();

Примітка


Часто запитують, як ініціалізувати покажчик на хеш (hash ref). Покажчик
– Це скалярна змінна і ініціалізується вона відповідним чином.
Наприклад:

    my $hash_ref;
my $hash_ref = 0; # zero

Додавання пари ключ / значення в хеш


У прикладах, наведених нижче, лапки навколо ключів можуть бути опущені, якщо
ключі – ідентифікатори.


Хеш:


Рішення

 $ Hash {"key"} = "value"; # хеш

$ Hash {$ key} = $ value; # хеш, з використанням змінної


Покажчик на хеш:


Рішення

 $ Href-> {"key"} = "value"; # покажчик на хеш

$ Href-> {$ key} = $ value; # покажчик на хеш, з використанням змінної


Додавання кількох пар ключ / значення в хеш


Рішення


Ці операції еквівалентні, просто другий більш читаємо.

 % Hash = ("key1", "value1", "key2", "value2", "key3", "value3");

%hash = (
key1 => “value1”,
key2 => “value2”,
key3 => “value3”,
);


Копіювання хешей


Рішення

 my% hash_copy =% hash; # копіювання хеша

my $ href_copy = $ href; # копіювання покажчика на хеш


Видалення однієї пари ключ / значення


Не дивлячись на те що видалення хеша та видалення покажчика на хеш, це різні
операція, обидві вони виконуються за допомогою функції delete.


Рішення


Хеш:

    delete $hash{$key};

Покажчик на хеш:

    delete $hash_ref->{$key};

Перебір всіх пар ключ / значення


Приклад, наведений нижче, друкує всі пари ключ / значення.


Рішення


Використання функції each з циклом while. Зверніть
увагу, що each перебере пари у випадковому порядку, але порядок буде
збігатися з перебором за допомогою функцій keys і values.

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

Для покажчик на хеш невелика відмінність:

    while ( my ($key, $value) = each(%$hash_ref) ) {
print "$key => $value
";
}

Рішення


Використання функції keys з циклом for

    for my $key ( keys %hash ) {
my $value = $hash{$key};
print "$key => $value
";
}

Приклад

    my $file = $ARGV[0] || "-";

my %from = ();

open FILE, "<$ file" or die "Can" t open $ file: $! ";

while( <FILE> ) {
if (/ ^ From: (.*)/) {$ from {$ 1} + +} # вважаємо повторення відправника
}

close FILE;

for my $sender ( sort keys %from ) {
print "$sender: $from{$sender}
";
}


Отримання розміру хеша


Рішення

    print "size of hash:  " . keys( %hash ) . ".
";

Solution

    my $i = 0;

$ I + = scalar keys% $ hash_ref; # метод 1: явний скалярний контекст
$ I + = keys% $ hash_ref; # метод 2: неявний скалярний контекст


Використання покажчиків на хеш


Рішення

    sub foo
{
my $hash_ref;

$hash_ref->{ “key1” } = “value1”;
$hash_ref->{ “key2” } = “value2”;
$hash_ref->{ “key3” } = “value3”;

return $hash_ref;
}

my $hash_ref = foo();

print "ключі …", sort keys% $ hash_ref, "…
";


Функція будує хеш з хешей і повертає вказівник на хеш


Рішення

    sub foo
{
my ( $login, $p, $uid, $gid, $gecos, $dir, $s );

my %HoH = ();

my $file = “/etc/passwd”;
open (PASSWD, "<$ file") or die "Can" t open $ file: $! ";

while( <PASSWD> ) {
($ Login, $ p, $ uid, $ gid, $ gecos, $ dir, $ s) = split (":");

$HoH{ $login }{ “uid” } = $uid;
$HoH{ $login }{ “gid” } = $gid;
$HoH{ $login }{ “dir” } = $dir;
}

close PASSWD;

return \%HoH;
}


Доступ до хешу з хешей за допомогою покажчиків. Висновок значень


Рішення

    my $rHoH = foo();

my( $uid, $gid, $dir );

for my $login ( keys %$rHoH ) {

$ Uid = $ rHoH-> {$ login} -> {"uid"}; # метод 1. Більш читабельний
$ Gid = $ {$ rHoH-> {$ login}} {"gid"}; # метод 2
$ Dir = $ {$ {$ rHoH} {$ login}} {"dir"}; # метод 3. Менш читабельний

print "uid: $uid, gid: $gid, dir, $dir.
";
}


Рішення

    my $rHoH = foo();

for my $k1 ( sort keys %$rHoH ) {
print "k1: $k1
";
for my $k2 ( keys %{$rHoH->{ $k1 }} ) {
print "k2: $k2 $rHoH->{ $k1 }{ $k2 }
";
}
}


Функція будує хеш з хешей з хешей і повертає вказівник на хеш


Рішення

    sub foo
{
my %HoHoH = ();

while( … ) {

if( /LOCATION:/ ) {

} elsif( /MODULE:/ ) {

$ HoHoH {$ loc} {$ module_type} {MODULE_NAME} = $ module_name;

} elsif( $ARGS_ALLOWED ) {

$ HoHoH {$ loc} {$ module_type} {$ arg_name} = $ arg_value;

}

}

return \%HoHoH;
}


Доступ до хешу з хешей з хешей за допомогою покажчиків. Висновок значень.


Рішення

    my $rHoH = foo();

for my $k1 ( sort keys %$rHoHoH ) {
print "$k1
";

for my $k2 ( sort keys %{$rHoHoH->{ $k1 }} ) {
print " $k2
";

for my $ k3 (sort keys% {$ rHoHoH-> {$ k1} -> {$ k2}}) {
print "$ k3 => $ rHoHoH-> {$ k1} -> {$ k2} -> {$ k3}
";
}
}
}


Висновок ключів і значень з хеша, отриманого за допомогою покажчика


Рішення

    while( my ($k, $v) = each %$hash_ref ) {
print "ключ: $ k, значення: $ v.
";
}

Визначення існування значення в хеше


Рішення

 print "Значення ІСНУЄ, але може бути не визначено.
"
if exists $hash{ $key };

print "Значення ВИЗНАЧЕНО, але може бути false.
"
if defined $hash{ $key };

print "Значення TRUE
"
if $hash{ $key };


Приклад


Припустимо, ми виконали SQL запит, який може повернути записи, що містять
значення NULL. Перед тим як використовувати результат запиту нам необхідно
перевірити, ВИЗНАЧЕНІ чи отримані значення. Зверніть увагу, функція
sql_fetch_hashref() з'єднується з сервером баз даних,
готує запит, виконує його і отримує покажчик на хеш за допомогою DBI
функції fetchrow_hashref().

    my $answers = “a,b,c,d,e”;

my $ sql = "select max_time, $ answers from questions".
“where question_number=?”;
my $hash_ref = sql_fetch_hashref( $sql, $q );

my @answers = split “,”, $answers;

my $max_time = $hash_ref->{max_time} || “60”;

my $hash_ref_ans;
for my $letter ( @answers ) {
$ Hash_ref_ans-> {$ letter} = $ hash_ref-> {$ letter}
if defined $hash_ref->{ $letter };
}


Цикл for створює хеш тільки з ПЕВНИМ парами ключ / значення.



Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*