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