Учебники

Perl — Массивы

Массив — это переменная, в которой хранится упорядоченный список скалярных значений. Переменным массива предшествует знак «at» (@). Для ссылки на один элемент массива вы будете использовать знак доллара ($) с именем переменной, за которым следует индекс элемента в квадратных скобках.

Вот простой пример использования переменных массива —

Live Demo

#!/usr/bin/perl

@ages = (25, 30, 40);             
@names = ("John Paul", "Lisa", "Kumar");

print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";

Здесь мы использовали escape-знак (\) перед знаком $, чтобы распечатать его. Другой Perl поймет это как переменную и напечатает ее значение. При выполнении это даст следующий результат —

$ages[0] = 25
$ages[1] = 30
$ages[2] = 40
$names[0] = John Paul
$names[1] = Lisa
$names[2] = Kumar

В Perl, List и Array часто используются термины, как будто они взаимозаменяемы. Но список — это данные, а массив — это переменная.

Создание массива

Переменные массива начинаются со знака @ и заполняются круглыми скобками или оператором qw. Например —

@array = (1, 2, 'Hello');
@array = qw/This is an array/;

Во второй строке используется оператор qw //, который возвращает список строк, разделяя разделенную строку пробелом. В этом примере это приводит к массиву из четырех элементов; первый элемент — это, а последний (четвертый) — массив. Это означает, что вы можете использовать разные строки следующим образом:

@days = qw/Monday
Tuesday
...
Sunday/;

Вы также можете заполнить массив, присваивая каждое значение индивидуально следующим образом:

$array[0] = 'Monday';
...
$array[6] = 'Sunday';

Доступ к элементам массива

При доступе к отдельным элементам из массива вы должны поставить перед переменной знак доллара ($), а затем добавить индекс элемента в квадратных скобках после имени переменной. Например —

Live Demo

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

print "$days[0]\n";
print "$days[1]\n";
print "$days[2]\n";
print "$days[6]\n";
print "$days[-1]\n";
print "$days[-7]\n";

Это даст следующий результат —

Mon
Tue
Wed
Sun
Sun
Mon

Индексы массива начинаются с нуля, поэтому для доступа к первому элементу необходимо указать 0 в качестве индексов. Вы также можете указать отрицательный индекс, в этом случае вы выбираете элемент из конца, а не из начала массива. Это означает следующее —

print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon

Массивы последовательных номеров

Perl предлагает ярлык для последовательных чисел и букв. Вместо того, чтобы печатать каждый элемент при подсчете до 100, например, мы можем сделать что-то вроде следующего:

Live Demo

#!/usr/bin/perl

@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);

print "@var_10\n";   # Prints number from 1 to 10
print "@var_20\n";   # Prints number from 10 to 20
print "@var_abc\n";  # Prints number from a to z

Здесь двойная точка (..) называется оператором диапазона . Это даст следующий результат —

1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z

Размер массива

Размер массива можно определить с помощью скалярного контекста массива — возвращаемое значение будет количеством элементов в массиве —

@array = (1,2,3);
print "Size: ",scalar @array,"\n";

Возвращаемым значением всегда будет физический размер массива, а не количество допустимых элементов. Вы можете продемонстрировать это, и разница между скалярным @array и массивом $ #, используя этот фрагмент, заключается в следующем:

Live Demo

#!/usr/bin/perl

@array = (1,2,3);
$array[50] = 4;

$size = @array;
$max_index = $#array;

print "Size:  $size\n";
print "Max Index: $max_index\n";

Это даст следующий результат —

Size: 51
Max Index: 50

В массиве содержится только четыре элемента, которые содержат информацию, но длина массива составляет 51 элемент с максимальным индексом 50.

Добавление и удаление элементов в массиве

Perl предоставляет ряд полезных функций для добавления и удаления элементов в массиве. У вас может возникнуть вопрос, что такое функция? До сих пор вы использовали функцию печати для печати различных значений. Точно так же существуют различные другие функции или иногда называемые подпрограммами, которые могут использоваться для различных других функций.

Sr.No. Типы и описание
1

нажмите @ ARRAY, LIST

Выдвигает значения списка в конец массива.

2

поп @ARRAY

Выскакивает и возвращает последнее значение массива.

3

сдвиг @ ARRAY

Сдвигает первое значение массива и возвращает его, сокращая массив на 1 и перемещая все вниз.

4

unshift @ARRAY, LIST

Добавляет список в начало массива и возвращает количество элементов в новом массиве.

нажмите @ ARRAY, LIST

Выдвигает значения списка в конец массива.

поп @ARRAY

Выскакивает и возвращает последнее значение массива.

сдвиг @ ARRAY

Сдвигает первое значение массива и возвращает его, сокращая массив на 1 и перемещая все вниз.

unshift @ARRAY, LIST

Добавляет список в начало массива и возвращает количество элементов в новом массиве.

Live Demo

#!/usr/bin/perl

# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins  = @coins\n";

# add one element at the end of the array
push(@coins, "Penny");
print "2. \@coins  = @coins\n";

# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3. \@coins  = @coins\n";

# remove one element from the last of the array.
pop(@coins);
print "4. \@coins  = @coins\n";

# remove one element from the beginning of the array.
shift(@coins);
print "5. \@coins  = @coins\n";

Это даст следующий результат —

1. @coins = Quarter Dime Nickel
2. @coins = Quarter Dime Nickel Penny
3. @coins = Dollar Quarter Dime Nickel Penny
4. @coins = Dollar Quarter Dime Nickel
5. @coins = Quarter Dime Nickel

Нарезка элементов массива

Вы также можете извлечь «фрагмент» из массива, то есть вы можете выбрать более одного элемента из массива, чтобы создать другой массив.

Live Demo

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3,4,5];

print "@weekdays\n";

Это даст следующий результат —

Thu Fri Sat

Спецификация для среза должна иметь список допустимых индексов, положительных или отрицательных, каждый из которых разделен запятой. Для скорости вы также можете использовать оператор диапазона.

Live Demo

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3..5];

print "@weekdays\n";

Это даст следующий результат —

Thu Fri Sat

Замена элементов массива

Теперь мы собираемся ввести еще одну функцию, называемую splice () , которая имеет следующий синтаксис:

splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

Эта функция удалит элементы @ARRAY, обозначенные OFFSET и LENGTH, и заменит их на LIST, если указано. Наконец, он возвращает элементы, удаленные из массива. Ниже приведен пример —

Live Demo

#!/usr/bin/perl

@nums = (1..20);
print "Before - @nums\n";

splice(@nums, 5, 5, 21..25); 
print "After - @nums\n";

Это даст следующий результат —

Before - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
After - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20

Здесь фактическая замена начинается с 6-го числа, после чего пять элементов затем заменяются с 6 на 10 номерами 21, 22, 23, 24 и 25.

Преобразовать строки в массивы

Давайте рассмотрим еще одну функцию с именем split () , которая имеет следующий синтаксис:

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

Эта функция разбивает строку на массив строк и возвращает ее. Если указан LIMIT, разбивается на не более того количества полей. Если PATTERN опущен, разделяется на пробел. Ниже приведен пример —

Live Demo

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

print "$string[3]\n";  # This will print Roses
print "$names[4]\n";   # This will print Michael

Это даст следующий результат —

Roses
Michael

Преобразовать массивы в строки

Мы можем использовать функцию join (), чтобы воссоединить элементы массива и сформировать одну длинную скалярную строку. Эта функция имеет следующий синтаксис —

join EXPR, LIST

Эта функция объединяет отдельные строки LIST в одну строку с полями, разделенными значением EXPR, и возвращает строку. Ниже приведен пример —

Live Demo

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

$string1 = join( '-', @string );
$string2 = join( ',', @names );

print "$string1\n";
print "$string2\n";

Это даст следующий результат —

Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom

Сортировка массивов

Функция sort () сортирует каждый элемент массива в соответствии с числовыми стандартами ASCII. Эта функция имеет следующий синтаксис —

sort [ SUBROUTINE ] LIST

Эта функция сортирует LIST и возвращает значение отсортированного массива. Если указан SUBROUTINE, то указанная логика внутри SUBTROUTINE применяется при сортировке элементов.

Live Demo

#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";

# sort this array
@foods = sort(@foods);
print "After: @foods\n";

Это даст следующий результат —

Before: pizza steak chicken burgers
After: burgers chicken pizza steak

Обратите внимание, что сортировка выполняется на основе ASCII числовых значений слов. Поэтому лучше всего сначала преобразовать каждый элемент массива в строчные буквы, а затем выполнить функцию сортировки.

$ [Специальная переменная

До сих пор вы видели простую переменную, которую мы определили в наших программах, и использовали ее для хранения и печати скалярных и массивных значений. Perl предоставляет множество специальных переменных, которые имеют предопределенное значение.

У нас есть специальная переменная, которая записывается как $ [ . Эта специальная переменная является скаляром, содержащим первый индекс всех массивов. Поскольку массивы Perl имеют индексирование с нуля, $ [почти всегда будет 0. Но если вы установите $ [1, то все ваши массивы будут использовать индексирование на основе. Рекомендуется не использовать любое другое индексирование, кроме нуля. Однако давайте возьмем один пример, чтобы показать использование $ [variable —

Live Demo

#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Foods: @foods\n";

# Let's reset first index of all the arrays.
$[ = 1;

print "Food at \@foods[1]: $foods[1]\n";
print "Food at \@foods[2]: $foods[2]\n";

Это даст следующий результат —

Foods: pizza steak chicken burgers
Food at @foods[1]: pizza
Food at @foods[2]: steak

Объединение массивов

Поскольку массив — это просто последовательность значений, разделенных запятыми, вы можете объединить их вместе, как показано ниже —

Live Demo

#!/usr/bin/perl

@numbers = (1,3,(4,5,6));

print "numbers = @numbers\n";

Это даст следующий результат —

numbers = 1 3 4 5 6

Встроенные массивы просто становятся частью основного массива, как показано ниже —

Live Demo

#!/usr/bin/perl

@odd = (1,3,5);
@even = (2, 4, 6);

@numbers = (@odd, @even);

print "numbers = @numbers\n";

Это даст следующий результат —

numbers = 1 3 5 2 4 6

Выбор элементов из списков

Нотация списка идентична записи для массивов. Вы можете извлечь элемент из массива, добавив квадратные скобки в список и указав один или несколько индексов —

Live Demo

#!/usr/bin/perl

$var = (5,4,3,2,1)[4];

print "value of var = $var\n"

Это даст следующий результат —

value of var = 1

Точно так же мы можем извлекать фрагменты, хотя без обязательного начального символа @ —

Live Demo

#!/usr/bin/perl

@list = (5,4,3,2,1)[1..3];

print "Value of list = @list\n";

Это даст следующий результат —