Power Perl Education главная страница возможности Power Guest Book темы оформления настройка скрипта FAQ Download благодарности

Хеши.

  • Что такое хеш
  • Хеш-переменные
  • Литеральное представление хеша.
  • Хеш-функции.
  • Срезы хешей.

    Что такое хеш.

    Хеш представляет собой набор скалярных данных, отдельные элементы которого выбираются по индексному значению. Индексные значения хеша - произвольные скаляры (ключи).

    Отдельные элементы хеша не стоят в каком-то определенном порядке. Порядок хранения пар ключ-значение изменить нельзя.

    Хеш-переменные.

    Имя хеш переменной состоит из знака процента и буквы или нескольких. Обращение к элементам хеша %test производится путем указания $test{$key}, где $key - любое скалярное выражение.

    Создание новых элементов хеша путем присваивания значения:

    	$test{"abc"} = "cba";
    	$test{12.7} = 21.7;
    

    Оращение к элементам хеша:

    	print $test{"abc"};
    	$test{12.7} += 3;			# разультат 24.7
    

    При обращении к несуществующему элементу хеша возвращается значение undef.

    Литеральное представление хеша.

    Фактически в Perl никакого литерального формата для хеша не предусмотрено, поэтому он просто представляется в виде списка:

    	@test_list = %test;	#	@test = qw(abc cba 12.7 24.7);
    	%test1 = @test_list;	#	создать test1 как test
    	%test1 = %test;		#	ускоренный метод
    	%test2 = ("abc", "cba", "12.7", "24.7");	
    			#	создать %test2 как %test
    			#	из литеральных представлений
    

    Порядок пар ключ-значение в этом развернутом формате произвольный и контролю не поддается.

    Используя операцию reverse, можно создать хеш, в котором ключи и значения поменяются местами:

    
    	%backwards = reverse %normal;
    

    Если %normal имеет два идентичных значения, то в %backwards они преватятся в один элемент.

    Хеш-функции.

    Некоторые функции, предназначенные для обработки хешей.

    Функция keys.

    Функция keys(%hash_name) выдает список всех текущих ключей в хеше %hash_name. Если элементы в хеше отсутствуют, функция keys возвращает пустой список.

    Пример:

    	$test{"abc"} = "cba";
    	$test{12.7} = 21.7;
    	@list = keys(%test);	# @list = ("abc", 12.7) или (12.4, "abc")
    

    Как и в остальных встроенных функциях круглые скобки не обязательны.

    	foreach $key (keys %test) {
    		print "at $key we have $test{$key}\n";
    	}
    

    В этом примере отдельные элементы хеша интерполируются в строки в двойных кавычках.

    В скалярном контексте функция keys выдает число элементов хеша.

    	if(keys( %hash)) {
    		...
    	}
    #
    #	or
    #
    	while(keys(%hash) < 10) {
    		...
    	}
    

    Если обратится к переменной %hash в скалярном контексте, то будет возвращено значение ложь или истина (пустой или нет):

    	if(%hash) {	# если истина ...
    		...
    	}
    

    Функция values.

    Функция values(%hash_name) возвращает список всех текущих значений хеша в том же порядке, в каком функция keys возвращает ключи.

    	%test = ();	#	empty
    	$test{"abc"} = "cba";
    	$test{"def"} = "fed";
    	@test_values = values(%test);	# ("cba", "fed") или ("fed", "cba")
    

    Функция each.

    Для выполнения цикла над всем хешем можно использовать функцию keys, но есть более эффективный способ - функция each(%hash_name), которая возвращает пару ключ-значение как двухэлементный список. При каждом вычислении этой функции для одного хеша возвращяется очередная пара, пока не будут перебраны все элементы. Если пар больше нет, возвращается пустой список.

    	while(($first, $last) = each(%test)) {
    		print "The value of $first is $last";
    	}
    
    

    Функция delete.

    Для удаления элементов хеша используется функция delete.

    	%test = ("abc", "cba", "12.7", "24.7");	
    	delete $test{"abc"};
    

    Срезы хешей.

    Использование среза хеша позволяет обращаться не к одному его элементу, а одновременно к набору.

    	$score{"mike"} = 205;
    	$score{"igor"} = 150;
    	$score{"nick"} = 30;
    #	or
    	($score{"mike"}, $score{"igor"}, $score{"nick"}) = (205, 150, 30);
    #	or
    	@score{"mike", "igor", "nick"} = (205, 150, 30);	# срез
    

    Можно сочетать использование среза и интерполяции пременных:

    	@players = qw(mike igor nick);
    	print "scores are: @score{@players}\n";
    

    Срезы хешей можно использовать для слияния меньшего хеша с большим:

    	@league{keys %score} = values %score;
    
    

    В этом примерепри наличии ключей-дубликатов используется значение из меньшего хеша.

    Наши партнёры:
    Каталог продукции ООО ВС Подшипник. Информация и прайс.
    Советы и примеры - ремонтируем самостоятельно
    Для вас Кулинарная книга, рецепты на каждый день.
    Дамский уголок - внешность, здоровье, советы и консультации.


Copyright © ClericICN, 2002 - 2009