Perl - Массивы
Массив - это переменная, в которой хранится упорядоченный список скалярных значений. Переменным массива предшествует знак «at» (@). Чтобы сослаться на отдельный элемент массива, вы будете использовать знак доллара ($) с именем переменной, за которым следует индекс элемента в квадратных скобках.
Вот простой пример использования переменных массива -
#!/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 термины «список» и «массив» часто используются как взаимозаменяемые. Но список - это данные, а массив - это переменная.
Создание массива
Переменные массива имеют префикс со знаком @ и заполняются либо круглыми скобками, либо оператором qw. Например -
@array = (1, 2, 'Hello');
@array = qw/This is an array/;
Во второй строке используется оператор qw //, который возвращает список строк, разделяя строку с разделителями пробелом. В этом примере это приводит к массиву из четырех элементов; первый элемент - это «это», а последний (четвертый) - «массив». Это означает, что вы можете использовать разные строки следующим образом:
@days = qw/Monday
Tuesday
...
Sunday/;
Вы также можете заполнить массив, назначив каждое значение индивидуально следующим образом:
$array[0] = 'Monday';
...
$array[6] = 'Sunday';
Доступ к элементам массива
При доступе к отдельным элементам из массива вы должны префикс переменной со знаком доллара ($), а затем добавить индекс элемента в квадратных скобках после имени переменной. Например -
#!/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, мы можем сделать что-то вроде следующего:
#!/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
Здесь двойная точка (..) называется range operator. Это даст следующий результат -
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 и $ # array, используя этот фрагмент, заключается в следующем:
#!/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 предоставляет ряд полезных функций для добавления и удаления элементов в массиве. У вас может возникнуть вопрос, что это за функция? Пока вы использовалиprintфункция для печати различных значений. Точно так же существуют различные другие функции или иногда называемые подпрограммами, которые можно использовать для различных других функций.
Sr.No. | Типы и описание |
---|---|
1 | push @ARRAY, LIST Помещает значения списка в конец массива. |
2 | pop @ARRAY Выскакивает и возвращает последнее значение массива. |
3 | shift @ARRAY Сдвигает первое значение массива и возвращает его, сокращая массив на 1 и перемещая все вниз. |
4 | unshift @ARRAY, LIST Добавляет список в начало массива и возвращает количество элементов в новом массиве. |
#!/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
Нарезка элементов массива
Вы также можете извлечь «фрагмент» из массива, то есть вы можете выбрать более одного элемента из массива, чтобы создать другой массив.
#!/usr/bin/perl
@days = qw/Mon Tue Wed Thu Fri Sat Sun/;
@weekdays = @days[3,4,5];
print "@weekdays\n";
Это даст следующий результат -
Thu Fri Sat
В спецификации для среза должен быть список допустимых индексов, положительных или отрицательных, каждый из которых разделен запятой. Для скорости вы также можете использовать.. оператор диапазона -
#!/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, если он указан. Наконец, он возвращает элементы, удаленные из массива. Ниже приведен пример -
#!/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, разбивается на максимальное количество полей. Если ШАБЛОН опущен, разбивается на пробелы. Ниже приведен пример -
#!/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, и возвращает строку. Ниже приведен пример -
#!/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 Numeric. Эта функция имеет следующий синтаксис -
sort [ SUBROUTINE ] LIST
Эта функция сортирует СПИСОК и возвращает отсортированное значение массива. Если задана ПОДПРОГРАММА, то при сортировке элементов применяется заданная логика внутри ПОДПРОГРАММЫ.
#!/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, тогда все ваши массивы будут использовать индексирование на основе. Не рекомендуется использовать любую другую индексацию, кроме нуля. Однако давайте рассмотрим один пример, чтобы показать использование $ [переменная -
#!/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
Объединение массивов
Поскольку массив представляет собой просто последовательность значений, разделенных запятыми, вы можете объединить их вместе, как показано ниже -
#!/usr/bin/perl
@numbers = (1,3,(4,5,6));
print "numbers = @numbers\n";
Это даст следующий результат -
numbers = 1 3 4 5 6
Встроенные массивы просто становятся частью основного массива, как показано ниже -
#!/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
Выбор элементов из списков
Обозначения списков идентичны обозначениям для массивов. Вы можете извлечь элемент из массива, добавив квадратные скобки в список и указав один или несколько индексов -
#!/usr/bin/perl
$var = (5,4,3,2,1)[4];
print "value of var = $var\n"
Это даст следующий результат -
value of var = 1
Точно так же мы можем извлекать срезы, хотя без необходимости в начальном символе @ -
#!/usr/bin/perl
@list = (5,4,3,2,1)[1..3];
print "Value of list = @list\n";
Это даст следующий результат -
Value of list = 4 3 2