Добрый день. Я сейчас прохожу курс повышения квалификации - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?
|
Ссылки
Ссылки на массивы
Подобным же образом можно работать со ссылками на массивы. Ссылка на переменную типа "массив" также создается с помощью операции взятия ссылки:
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; # изменение элемента массива
В элементах массива можно хранить ссылки на другие массивы: это позволяет создавать в Perl многомерные массивы или "массивы массивов", как это делается в языке Java. В этом случае доступ к элементам многомерного массива также обычно записывается с использованием операции "стрелка", которая употребляется нужное количество раз:
@{$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 изображен получившийся в результате "массив массивов" (Аrray of Аrrays, AoA), представляющий собой многомерный массив.
Для вывода значений многомерного массива обычно используется нужное число вложенных циклов 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);
Списки ссылок на объекты могут, например, передаваться в подпрограмму для изменения перечисленных в списке объектов. Передача аргументов в подпрограммы по ссылке и по значению будет рассмотрена в следующей лекции.