Титульная страница
ISO 9000 ISO 14000 Forum
Титульная страница
Цель системы качества
Управление качеством
ISO
ISO 9000
ISO 13485
ISO 14000
ISO 17025
OHSAS 18001
ISO 19011
Total Quality Management
Project Management
Фармацевтика
Отраслевые стандарты
Информационные технологии
Оформление документации
Ссылки 
Поиск на сайте
Forum
Реклама на сайте





Хеши.

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

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

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

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

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

    Имя хеш переменной состоит из знака процента и буквы или нескольких. Обращение к элементам хеша %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;
    

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

Rambler's Top100
Hosted by uCoz