Perl - Arrays

Uma matriz é uma variável que armazena uma lista ordenada de valores escalares. Variáveis ​​de matriz são precedidas por um sinal "arroba" (@). Para se referir a um único elemento de uma matriz, você usará o cifrão ($) com o nome da variável seguido pelo índice do elemento entre colchetes.

Aqui está um exemplo simples de como usar as variáveis ​​de matriz -

#!/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";

Aqui, usamos o sinal de escape (\) antes do sinal $ apenas para imprimi-lo. Outro Perl o entenderá como uma variável e imprimirá seu valor. Quando executado, isso produzirá o seguinte resultado -

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

Em Perl, os termos de lista e matriz são freqüentemente usados ​​como se fossem intercambiáveis. Mas a lista são os dados e a matriz é a variável.

Criação de Array

Variáveis ​​de matriz são prefixadas com o sinal @ e são preenchidas usando parênteses ou o operador qw. Por exemplo -

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

A segunda linha usa o operador qw //, que retorna uma lista de strings, separando a string delimitada por um espaço em branco. Neste exemplo, isso leva a uma matriz de quatro elementos; o primeiro elemento é 'this' e o último (quarto) é 'array'. Isso significa que você pode usar linhas diferentes da seguinte forma -

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

Você também pode preencher uma matriz atribuindo cada valor individualmente da seguinte forma -

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

Acessando Elementos de Matriz

Ao acessar elementos individuais de uma matriz, você deve prefixar a variável com um cifrão ($) e, em seguida, anexar o índice do elemento entre colchetes após o nome da variável. Por exemplo -

#!/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";

Isso produzirá o seguinte resultado -

Mon
Tue
Wed
Sun
Sun
Mon

Os índices da matriz começam do zero, portanto, para acessar o primeiro elemento, você precisa fornecer 0 como índices. Você também pode fornecer um índice negativo, caso em que seleciona o elemento do final, em vez do início, da matriz. Isso significa o seguinte -

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

Matrizes de números sequenciais

Perl oferece um atalho para números e letras sequenciais. Em vez de digitar cada elemento ao contar até 100, por exemplo, podemos fazer algo como o seguinte -

#!/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

Aqui, o ponto duplo (..) é chamado range operator. Isso produzirá o seguinte resultado -

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

Tamanho da Matriz

O tamanho de uma matriz pode ser determinado usando o contexto escalar na matriz - o valor retornado será o número de elementos na matriz -

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

O valor retornado sempre será o tamanho físico da matriz, não o número de elementos válidos. Você pode demonstrar isso, e a diferença entre @array escalar e $ # array, usando este fragmento é a seguinte -

#!/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";

Isso produzirá o seguinte resultado -

Size: 51
Max Index: 50

Existem apenas quatro elementos na matriz que contém informações, mas a matriz tem 51 elementos, com um índice mais alto de 50.

Adicionando e removendo elementos na matriz

Perl fornece várias funções úteis para adicionar e remover elementos em um array. Você pode ter uma pergunta o que é uma função? Até agora você usouprintfunção para imprimir vários valores. Da mesma forma, existem várias outras funções ou às vezes chamadas de sub-rotinas, que podem ser usadas para várias outras funcionalidades.

Sr. Não. Tipos e descrição
1

push @ARRAY, LIST

Coloca os valores da lista no final da matriz.

2

pop @ARRAY

Aparece e retorna o último valor da matriz.

3

shift @ARRAY

Desloca o primeiro valor da matriz e o retorna, encurtando a matriz em 1 e movendo tudo para baixo.

4

unshift @ARRAY, LIST

Anexa a lista à frente da matriz e retorna o número de elementos na nova matriz.

#!/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";

Isso produzirá o seguinte resultado -

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

Elementos de matriz de fatias

Você também pode extrair uma "fatia" de uma matriz - ou seja, você pode selecionar mais de um item de uma matriz para produzir outra matriz.

#!/usr/bin/perl

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

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

print "@weekdays\n";

Isso produzirá o seguinte resultado -

Thu Fri Sat

A especificação de uma fatia deve ter uma lista de índices válidos, positivos ou negativos, cada um separado por uma vírgula. Para velocidade, você também pode usar o.. operador de alcance -

#!/usr/bin/perl

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

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

print "@weekdays\n";

Isso produzirá o seguinte resultado -

Thu Fri Sat

Substituindo Elementos de Matriz

Agora vamos apresentar mais uma função chamada splice(), que tem a seguinte sintaxe -

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

Esta função removerá os elementos de @ARRAY designados por OFFSET e LENGTH, e os substituirá por LIST, se especificado. Finalmente, ele retorna os elementos removidos do array. A seguir está o exemplo -

#!/usr/bin/perl

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

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

Isso produzirá o seguinte resultado -

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

Aqui, a substituição real começa com o 6º número depois que cinco elementos são então substituídos de 6 a 10 com os números 21, 22, 23, 24 e 25.

Transforme Strings em Arrays

Vamos dar uma olhada em mais uma função chamada split(), que tem a seguinte sintaxe -

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

Esta função divide uma string em uma matriz de strings e a retorna. Se LIMIT for especificado, divide no máximo esse número de campos. Se PATTERN for omitido, divide-se em espaços em branco. A seguir está o exemplo -

#!/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

Isso produzirá o seguinte resultado -

Roses
Michael

Transforme Arrays em Strings

Podemos usar o join()função para reunir os elementos da matriz e formar uma longa sequência escalar. Esta função tem a seguinte sintaxe -

join EXPR, LIST

Esta função une as strings separadas de LIST em uma única string com campos separados pelo valor de EXPR e retorna a string. A seguir está o exemplo -

#!/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";

Isso produzirá o seguinte resultado -

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

Classificando matrizes

o sort()função classifica cada elemento de uma matriz de acordo com os padrões numéricos ASCII. Esta função tem a seguinte sintaxe -

sort [ SUBROUTINE ] LIST

Esta função classifica a LIST e retorna o valor da matriz classificada. Se SUBROUTINE for especificado, a lógica especificada dentro do SUBTROUTINE será aplicada durante a classificação dos elementos.

#!/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";

Isso produzirá o seguinte resultado -

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

Observe que a classificação é realizada com base no valor numérico ASCII das palavras. Portanto, a melhor opção é primeiro transformar cada elemento da matriz em letras minúsculas e, em seguida, executar a função de classificação.

A $ [Variável Especial

Até agora, você viu variáveis ​​simples que definimos em nossos programas e as usamos para armazenar e imprimir valores escalares e de array. Perl fornece inúmeras variáveis ​​especiais, que têm seus significados predefinidos.

Temos uma variável especial, que é escrita como $[. Esta variável especial é um escalar contendo o primeiro índice de todos os arrays. Como os arrays Perl têm indexação baseada em zero, $ [quase sempre será 0. Mas se você definir $ [como 1, todos os seus arrays usarão a indexação baseada em. Recomenda-se não usar qualquer outra indexação diferente de zero. No entanto, vamos dar um exemplo para mostrar o uso de $ [variável -

#!/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";

Isso produzirá o seguinte resultado -

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

Mesclando matrizes

Como uma matriz é apenas uma sequência de valores separados por vírgulas, você pode combiná-los conforme mostrado abaixo -

#!/usr/bin/perl

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

print "numbers = @numbers\n";

Isso produzirá o seguinte resultado -

numbers = 1 3 4 5 6

Os arrays incorporados tornam-se apenas uma parte do array principal, conforme mostrado abaixo -

#!/usr/bin/perl

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

@numbers = (@odd, @even);

print "numbers = @numbers\n";

Isso produzirá o seguinte resultado -

numbers = 1 3 5 2 4 6

Selecionando Elementos de Listas

A notação de lista é idêntica à dos arrays. Você pode extrair um elemento de uma matriz acrescentando colchetes à lista e fornecendo um ou mais índices -

#!/usr/bin/perl

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

print "value of var = $var\n"

Isso produzirá o seguinte resultado -

value of var = 1

Da mesma forma, podemos extrair fatias, embora sem a necessidade de um caractere @ inicial -

#!/usr/bin/perl

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

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

Isso produzirá o seguinte resultado -

Value of list = 4 3 2