my $scalar = 'Скаляр'; # объект ссылки my $ref2scalar = \$scalar; # ссылка на скаляр
На рис. 11.1 показан результат сохранения
(рис 11.1) Ссылка на скалярное значениеПри помощи операции '\' можно брать
my $ref2literal = \'Литерал'; # ссылка на литерал my $ref2expression = \($n1*$n2); # ссылка на выражение
ref(), которая возвращает строку, описывающую
print ref($ref2scalar); # выведет: 'SCALAR'
А что получится, если вывести значение самой
print $ref2scalar; # выведет, например: 'SCALAR(0x335b04)'
Обратно преобразовать в
Чтобы получить доступ к значению, на которое указывает
print "${$ref2scalar} "; # или: $$ref2scalar
print "${$ref2literal} "; # или: $$ref2literal
print "${$ref2expression} "; # или: $$ref2expression
Значение скалярной переменной при доступе по ссылке, естественно, может изменяться, но попытка с помощью
${$ref2scalar} = 'Новый скаляр'; # вполне законно
${$ref2literal} = 'Новый литерал'; # ОШИБКА!!!
Когда на какое-то значение ссылается несколько ссылочных переменных, то обращаться к этому значению можно с помощью любой из них. Значение доступно до тех пор, пока на него имеется хотя бы одна
my $ref2scalar = \$scalar; # ссылка на скаляр
my $one_more_ref = $ref2scalar; # копия ссылки на скаляр
# будет выведено одно и то же значение $scalar:
print "${$ref2scalar} ${$one_more_ref}";
На рис. 11.2 показана ситуация, когда несколько ссылок указывают на одну скалярную переменную.
(рис 11.2) Несколько ссылок на скалярЕсли переменная $ref2scalar перестанет ссылаться на $ (например, после undef $ref2scalar ), то значение $ все еще будет доступно через переменную $one_more_ref.
Значением объекта
$value = 'Полезное значение'; $ref1 = \$value; # ссылка на значение $ref2 = \$ref1; # ссылка на ссылку на значение $ref3 = \$ref2; # ссылка на ссылку на ссылку на значение
Можно организовать многоуровневые косвенные
$ref_chain = \\\$value; # цепочка из трех ссылок
Для доступа по такой цепочке ссылок к исходному значению правило разыменования применяется нужное число раз. Например, в цепочке из трех ссылок с помощью трех
# выведем исходное значение через $ref3:
print ${${${$ref3}}}; # или короче: print $$$$ref3;
# или через $ref_chain:
print $$$$ref_chain;
Если применить функцию ref() к переменной, содержащей 'REF'. Если преобразовать в строку значение
print ref($ref_chain); # выведет: 'REF' print $ref_chain; # выведет, например: 'REF(0x334e8c)'
Подобным же образом можно работать со
my @array = ('Это', 'список', 'в', 'массиве');
my $ref2array = \@array; # ссылка на массив
Если обращение к массиву будет происходить только по ссылке, то можно обойтись без переменной типа "
my $ref2anon = [ # ссылка на анонимный массив 'Это', 'анонимный', 'массив' ]; # конец присваивания ссылки my $ref2empty = []; # ссылка на пустой анонимный массив
my $ref2copy = [@array]; # ссылка на копию массива
(рис 11.3) Ссылки на обычный и анонимный массивы# будет выведено одно и то же значение @array:
print "@{$ref2array} @$ref2array\n";
Естественно, что, обращаясь к массиву по ссылке, можно выполнять с ним любые действия, как и с именованным массивом, например:
my @array_copy = @{$ref2array}; # копия массива
@{$ref2array}[0,1] = ('Новый', 'список'); # срез массива
print ${$ref2array}[0]; # или: $$ref2array[0]
Обращение по ссылке к элементу массива более наглядно записывается с помощью инфиксной операции ->, слева от которой записывается
# доступ по ссылке к значению элемента массива: my $element_value = $ref2array->[0]; # изменение значения элемента массива: $ref2array->[0] = $new_value;
Как к обычным скалярным значениям можно обращаться по ссылке к отдельным элементам массива, например:
$ref2element = \$array[0]; # ссылка на элемент массива
${$ref2element} = $new_value; # изменение элемента массива
В элементах массива можно хранить
@{$ref2NxM->[$n]} # вложенный массив
$ref2NxM->[$n]->[$m] # скалярный элемент двумерного массива
$ref2NxMxP->[$n]->[$m]->[$p] # элемент 3-мерного массива
Для удобства чтения программы допускается не записывать операцию "стрелка" между парами
$ref2NxM->[$n][$m] # так гораздо симпатичнее! $ref2NxMxP->[$n][$m][$p] # а тем более так...
Для примера приведем программу создания двумерного массива из трех строк по пять элементов в каждой строке:
my $ref2RxC = []; # ссылка на анонимный массив массивов
for (my $row = 0; $row < 3; $row++) { # цикл по строкам
$ref2RxC->[$row] = []; # строка: вложенный массив
for (my $col = 0; $col < 5; $col++) { # по колонкам
$ref2RxC->[$row]->[$col] = ($row+1).'.'.($col+1);
}
}
Небольшие многомерные массивы удобно создавать, используя вложенные
$ref2RxC = [ # ссылка на двумерный анонимный массив [1.1, 1.2, 1.3, 1.4, 1.5], # 1-я "строка" [2.1, 2.2, 2.3, 2.4, 2.5], # 2-я "строка" [3.1, 3.2, 3.3, 3.4, 3.5] # 3-я "строка" ]; # конец присваивания ссылки
На рис. 11.4 изображен получившийся в результате "
(рис 11.4) Организация многомерного 'массива массивов'Для вывода значений многомерного массива обычно используется нужное число for или других циклических конструкций:
# цикл по строкам (элементам массива верхнего уровня)
for (my $row = 0; $row < @{$ref2RxC}; $row++) {
# цикл по столбцам (элементам вложенных массивов)
for (my $col = 0; $col < @{$ref2RxC->[$row]}; $col++) {
print "$ref2RxC->[$row][$col] ";
}
print "\n";
}
В результате выполнения этой программы построчно будет выведено значение всех элементов из массива массивов:
1.1 1.2 1.3 1.4 1.5 2.1 2.2 2.3 2.4 2.5 3.1 3.2 3.3 3.4 3.5
В любой
@reference_list = (\$scalar, \@array, \%hash);
Можно записать то же самое более простым способом, поставив операцию взятия
@reference_list = \($scalar, @array, %hash);
Списки ссылок на объекты могут, например, передаваться в
Если попытаться разыменовать
$array_ref->[4] = '5-й элемент'; # присваивание значения
print ref($array_ref); # вызывает к жизни массив
print scalar(@{$array_ref}); # из 5 элементов!
print $$array_ref[4]; # печатаем значение
Подобным образом применяя автосоздание объектов, можно создать цепочку ссылок, указывающих на некоторое значение:
$$$$ref = 25; # при попытке присвоить значение # создаются 3 ссылочных переменных и 1 скалярная print "$ref $$ref $$$ref $$$$ref\n"; # выведет: REF(0x334dd8) REF(0x334e8c) SCALAR(0x334e98) 25
Все, что говорилось о
my %hash = ('Хэш' => 'ассоциативный массив');
my $ref2hash = \%hash; # ссылка на весь хэш
print ref($ref2hash); # вернет: HASH
my $ref2anon = { # ссылка на анонимный хэш
'language' => 'Perl',
'author' => 'Larry Wall',
'version' => 5.8
}; # конец присваивания ссылки
При помощи
my $ref2copy = {%hash}; # ссылка на копию хэша
# будет выведено одно и то же значение %hash:
print %{$ref2hash}, %$ref2hash;
При помощи ссылок с хэшами можно выполнять любые действия, обращая внимание на правильное
%hash_copy = %{$ref2hash}; # копия хэша
@hash_slice= @{$ref2hash}{$key1, $key2}; # срез хэша (массив)
@hash_keys = keys %{$ref2hash}; # ключи хэша (массив)
${$ref2hash}{'ключ'} = 'значение'; # изменение значения
print $$ref2hash{'ключ'}; # доступ к значению элемента хэша
В другой форме разыменования
$ref2hash->{'термин'} = 'определение'; # добавим элемент
$value = $ref2hash->{'Хэш'}; # найдем значение по ключу
Если Tie::RefHash.
Аналогично созданию "массива массивов" создаются и другие разновидности ссылочных
my $AoH = [ # этапы "Формулы-1" '2006 года
{grandprix=>'Бахрейна', date=>'2006.03.12'},
{grandprix=>'Малайзии', date=>'2006.03.19'},
{grandprix=>'Австралии', date=>'2006.04.02'},
{grandprix=>'Сан-Марино', date=>'2006.04.23'},
# и так далее...
];
# напечатать хэш, на который ссылается 4-й элемент массива
print "Гран-при $AoH->[3]->{grandprix} $AoH->[3]->{date}";
# выведет: Гран-при Сан-Марино 2006.04.23
Для того чтобы ассоциировать с каждым ключом хэша список скалярных значений, применяется хэш массивов (Нash of Аrrays, HoA). Приведем пример хэша массивов, где в каждом элементе хэша хранится
my $HoA = { # годы создания языков программирования
1964 => ['SIMULA', 'BASIC', 'PL/1'],
1970 => ['Forth', 'Pascal', 'Prolog'],
1979 => ['Ada', 'Modula-2'],
1987 => ['Perl', 'Haskell', 'Oberon'],
1991 => ['Python', 'Visual Basic']
};
# напечатать список, ассоциированный с 1987 годом
foreach my $language (sort @{$HoA->{1987}}) {
print "$language ";
} # выведет: Haskell Oberon Perl
Элементы хэша также могут хранить
my $HoH = { # авторы и годы создания языков программирования
'Pascal' => {author=>'Niklaus Wirth', year=>1970},
'Perl' => {year=>1987, author=>'Larry Wall'},
'C' => {author=>'Dennis Ritchie', year=>1972}
};
# в каком году был создан Pascal?
print $HoH->{'Pascal'}->{'year'}; # выведет: 1970
# кто создал язык Си?
print $HoH->{'C'}->{'author'}; # выведет: Dennis Ritchie
Имеющиеся в других
my $family = [ # массив записей о семье
{name => 'Михаил', birthday => [1958, 11, 12]},
{name => 'Ирина', birthday => [1955, 03, 23]},
{name => 'Маша', birthday => [1980, 07, 27]},
{name => 'Миша', birthday => [1981, 11, 28]},
{name => 'Лев', birthday => [1988, 06, 24]}
];
# напечатаем год рождения Маши:
print "$family->[2]->{birthday}->[0]"; # или проще:
print "$family->[2]{birthday}[0]"; # выведет: 1980
Подобные структуры легко
# адрес в виде анонимного хэша, в $address - ссылка на него:
$address = {country => 'Россия', index => 641870}; # и т.д.
# добавить поле адреса и поместить туда $address:
foreach my $person (@{$family}) { # пропишем всех
$person->{address} = $address; # по одному адресу
}
# выведем почтовый индекс для Ирины
print "$family->[1]->{address}->{index}\n"; # 641870
На рис. 11.5 приведена ссылочная структура данных, которая получилась в результате выполнения программы. Для доступа по $.
(рис 11.5) Пример ссылочной структуры данныхС помощью ссылок создаются и другие
| Скаляр | Хэш | ||
|---|---|---|---|
| Взятие |
$sref = \$ |
$aref = \@ |
$ |
| Создание |
$sref = \' |
$aref = [$a, $b]; | $ |
| Доступ к значению объекта |
${$sref} $$sref | @{$aref} @$aref | %{$ |
| Доступ к значению элемента объекта |
$aref-> [$index] ${$aref}[$index] | $ |
|
| Доступ к срезу объекта |
@{$aref}[$i1, $i2] | @{$ |
|
| Значение функции ref($ref) для объекта |
Программирующие на
$s = "localtime() ${\($x=localtime)} в скалярном контексте";
# значение выражения, например: 'Sun Mar 26 20:17:36 2006'
Чтобы включить в строку значение выражения, возвращающего список, его надо заключить в квадратные скобки, организуя
$a = "localtime() @{[localtime()]} в списочном контексте";
# значение выражения, например: '36 17 20 26 2 106 0 84 1'
$referent1 = 'Референт'; # объект ссылки
$symlink = 'referent' . 1; # символическая ссылка
# доступ по символической ссылке к значению объекта
print ${$symlink}; # будет выведено: 'Референт'
Символические use strict 'refs'.
В этой лекции изучены
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.