PERL - статьи


Доступ к элементам - часть 3


$vziat = shift @ARGV or die $!;

%svojstvo = (

"malina" => "vkusnaia",

"svekla" => "krasnaya",

"kozmodrom" => "nebolshoy",

"magazin" => "dvuhetagnij");

%predmet = reverse %svojstvo;

if (exists $svojstvo{$vziat}){print "$vziat," ", $svojstvo{$vziat}\n";}

elsif (exists $predmet{$vziat}){print "$vziat," ", $predmet{$vziat}\n";}

например если ввести в терминале:

bash-2.03$ ./1.pl malina

то скрипт выдаст:

malina vkusnaia

или

bash-2.03$ ./1.pl vkusnaia

vkusnaia malina

В чем различие delete и undef для хешей?

Хеши являются парами скаляров, первый - ключ, второй значение.

Ключ может быть строкой, в то время как значением хеша может

быть любой вид скаляра: строка, число или ссылка. Если ключ

содержится в хеше, то exists($key) возвратит истину. Значение для

какого-то конкретного ключа может быть undef'ом, и $array{$key}

возвратит так-же undef, но exists($key) возвратит истину.

Иными словами в хеше может быть реализована связка ('$key', 'undef')

В качестве примера можно привести следующую таблицу %ary:

keys values

+------+------+

| a | 3 |

| x | 7 |

| d | 0 |

| e | 2 |

+------+------+

Этот хеш выглядит примерное так:

$ary{'a'} true

$ary{'d'} false

defined $ary{'d'} true

defined $ary{'a'} true

exists $ary{'a'} true (perl5 only)

grep ($_ eq 'a', keys %ary) true

Если теперь сказать

undef $ary{'a'}

То таблица будет читаться следующим образом:

keys values

+------+------+

| a | undef|

| x | 7 |

| d | 0 |

| e | 2 |

+------+------+

И теперь логические состояния в хеше уже немного другие,

изменения показаны регистром

$ary{'a'} FALSE

$ary{'d'} false

defined $ary{'d'} true

defined $ary{'a'} FALSE

exists $ary{'a'} true (perl5 only)

grep ($_ eq 'a', keys %ary) is true

Отсюда следует вывод, что можно держать значение undef'ом,

но ключ всегда должен быть определен.

Теперь рассмотрим операцию удаления элемента из хеша:

delete $ary{'a'}

после этого таблица будет выглядеть так:

keys values

+------+------+

| x | 7 |

| d | 0 |

| e | 2 |

+------+------+

Состояния элементов в хеше уже другие,

изменения показаны, как и в предыдущем примере, различающимся регистром.

$ary{'a'} is false

$ary{'d'} is false

defined $ary{'d'} is true

defined $ary{'a'} is false

exists $ary{'a'} is FALSE (perl5 only)

grep ($_ eq 'a', keys %ary) is FALSE

from:




- Начало -  - Назад -  - Вперед -



Книжный магазин