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

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

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

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

Знак перед ссылкой на переменную ($ или @) определяет контекст индексного выражения. С префиксом $ выражение вычисляется в скалярном контексте. Но если в начале стоит знак @, индексное выражение вычисляется в списочном контексте для получения списка индексов.


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

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[2], $items[3]), но она более компактна и эффективна.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Отбор элементов списка
Перехват ошибок в блоках eval
Преобразование элементов списка
Срезы
Срезы хешей

Вернуться в раздел: Perl / 16. Расширенные возможности Perl