Срезы массивов

Предыдущий пример можно сделать еще проще. При создании срезов на базе массивов (вместо списков) круглые скобки необязательны. Следовательно, срез может выглядеть так:

my @numbers = @names[ 9, 0, 2, 1, 0 ];


Дело не сводится только к отсутствию круглых скобок; в действительности здесь используется другая запись обращения к элементам – срез массива. Ранее мы говорили, что символ @ в @names означает «все элементы». В Perl символ $ означает отдельное значение, а символ @ – список значений. Срез всегда является списком, и в синтаксисе среза массивов на это обстоятельство указывает знак @. Когда вы встречаете в программе Perl конструкцию вида @names[ ... ], сделайте то, что делает Perl, и обратите внимание на знак @ в начале и на квадратные скобки в конце. Квадратные скобки означают, что происходит индексирование массива, а знак @ – что вы получаете список1 элементов вместо одного значения (на которое бы указывал знак $).

Знак перед ссылкой на переменную ($ или @) определяет контекст индексного выражения. С префиксом $ выражение вычисляется в скалярном контексте. Но если в начале стоит знак @, индексное выражение вычисляется в списочном контексте для получения списка индексов. Таким образом, @names[ 2, 5 ] означает то же самое, что ($names, $names). Если вам нужен список значений, используйте запись со срезом массива. Везде, где требуется использовать список, вы можете использовать более простой срез массива. Однако срезы также могут использоваться в одном месте, где простые списки использоваться не могут, – срезы могут интерполироваться прямо в строку:

my @names = qw{ zero one two three four five six seven eight nine };
print "Bedrock @names[ 9, 0, 2, 1, 0 ]\n";


При попытке интерполировать @names выводятся элементы массива, разделенные пробелами. Если вместо этого интерполировать @names[ 9, 0, 2, 1, 0 ], вы получите только указанные элементы, разделенные пробелами. Вернемся к примеру с библиотекой. Допустим, программа обновляет адрес и телефон одного из читателей, потому что он только что переехал в новый дом. Если информация о нем поставляется в виде списка @items, обновление двух элементов массива может выполняться примерно так:

my $new_home_phone = "555-6099";
my $new_address = "99380 Red Rock West";
@items[2, 3] = ($new_address, $new_home_phone);


И снова срез массива обеспечивает более компактную запись, чем список элементов. В этом случае последняя строка эквивалентна присваиванию ($items, $items), но она более компактна и эффективна.
Теги:
расширенные возможности
Добавлено: 20 Июля 2018 21:36:05 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...