Listas e matrizes

Mais algumas funcionalidades do Perl deve ser coberto antes de todos os programas mais interessantes podem ser escritos. "Primeiro, precisamos Perl listas" (ou "matrizes"). A lista de Perl é como uma classe matriz dinâmica em C + + ou Java java.util.Vector (por exemplo). Listas não usar a sintaxe do Perl objeto, mas é basicamente uma lista de um objeto que possui os dados e que tem um grupo associado de funções. A lista de Perl:

  

Possui uma coleção de elementos de dados (normalmente valores escalares, mas você pode criar listas de listas e outras estruturas mais complexas, como explicado no perldsc. Does (OK, "tem feito a ele", como estas não são funções de membro da classe):

- Criar uma lista, geralmente inicializando-lo com um conjunto não vazio de elementos de dados (embora listas vazias são muito bem).

- Adicionar elementos "na frente 'ou' no final 'da lista.

- Remover elementos "na frente" ou "a fim" das listas.

Elementos - Acesso em posições específicas (esta característica dá-lhe 'array'-como comportamentos, bem como comportamentos lista).

- Retorna o tamanho de sua coleção (comprimento de array dinâmico).

- Copie para outra matriz.

Outras funções relacionadas com as listas incluem funções para ordenar listas e para o regresso de cópias das listas com os elementos na ordem inversa.

As listas são designadas usando o '@' qualifier tipo. Seus nomes seguem as convenções habituais

- Carta seguido por caracteres alfanuméricos (e alguns outros caracteres especiais nos nomes de listas fornecidas no núcleo do Perl). Quando os nomes que fazem, Perl considera que o carácter de sublinhado como uma carta. Lista de nomes válidos são:

@ @ mylist resultados inputlines @ @ @ _data list_1

Perl mantém distintas "espaços" para a sua escalar diferentes tipos de lista e hash de dados (e outros tipos como "identificadores de arquivo '). Você pode ter um $ escalar resultados e uma lista @ Perl resultados sem causar qualquer confusão (embora você pode virar um programador de manutenção inexperientes que tem que cuidar do seu código).

Literais Lista são suportados: (1, 2, 3) (Tom "," Dick "," Harry "," sue ") ($ nome, endereço, $ cidade)

Literais Lista muitas vezes são usados para inicializar matrizes. Outro uso tem a lista como um literal lvalue (algo sobre o lado esquerdo de uma instrução de atribuição). Este uso será ilustrado mais tarde, é uma conveniência característica relacionada com a extracção de elementos específicos de uma lista existente. Alguns exemplos de literais lista a ser utilizado na lista / criação da matriz são:

@ PlacesIveBeen = (); # Eu estive em nenhuma parte ainda - portanto, uma lista vazia @ GradePts = (45, 50, 65, 75, 85); @ cidades = ( "London", "Paris", "Nova York" , "Roma", "Tokyo", "Sydney"); @ people = (Tom "," Dick "," Harry "," sue "); @ TeenYears = (13 .. 19);

O último destes ilustra Perl '..' operador de intervalo. Esta é uma forma curta de definir a coleção como (13, 14, 15, 16, 17, 18, 19). Faixa de operadores podem ser usados em 'foreach' iterativo construções - por (1 .. 100); loops foreach são explicadas mais adiante neste artigo. Dado que é comum a necessidade de inicializar uma lista de palavras, Perl tem uma função auxiliar qw () . Assim, você pode ter:

pessoas @ = qw tom dick (Harry SUE);

A função qw () nem sempre é apropriado. O uso que se segue:

Cidades @ = qw Nova York "(Londres Paris, Roma, Tóquio, Sydney);

resultados em uma lista como: (Londres, Paris, 'Nova York', Roma, Tóquio, Sydney), que provavelmente não é o que se pretendia. O fragmento de código a seguir ilustra a criação e utilização de algumas listas. Os laços ilustrar diferentes modos de acessar os elementos da lista:

@ Cities1 = ( "London", "Paris", "Nova York"); # uma lista com 3 elementos @ Cities2 = qw Los (Roma "Angeles" San Francisco "); elementos # 5! @ Cities3 = (" Wagga "," Hay "," Cooma "); # como qq () e (q), qw () permite que outros delimitadores: @ Cities4 = qw \ Thiroul Bellambi Keiraville \; impressão Cities1": \ n "; $ size = @ Cities1; for ($ i = 0; i $ size <$; $ i + +) (print Cities1 [$ i], "\ n";) impressão Cities1 ": \ n"; foreach $ cidade (@ Cities2) (print $ cidade, "\ n";) impressão Cities3 ": \ n"; foreach $ i (0 .. $ # Cities3) (print $ i Cities3 [$], "\ n";) impressão Cities4 ": @ Cities4 \ n "; print @ Cities4;

A linha $ size = @ Cities1; ilustra o uso de uma matriz em um "contexto escalar '; Perl interpreta isso como um pedido de extensão da matriz, de modo $ size assume o valor 3. O primeiro ciclo é um ciclo de contagem convencional, com o índice de ciclo utilizado para indexar a coleção @ Cities1. Observe o uso $ cidades [$ i]; o tipo de dados aqui é um escalar - que se extrai um elemento de dados único da posição especificada na coleção. O segundo e terceiro loops for são exemplos de loop Perl construção foreach. Estes laços têm a forma:

foreach  (lista) bloco foreach (lista) Bloquear

(A palavra-chave formay ser usado ao invés de foreach, mas foreach é mais legível.) Normalmente você quer uma variável que referencia o elemento atual da lista, mas isso não é essencial. O primeiro dos loops foreach no código de exemplo simplesmente acessa cada do (cinco!) elementos em $ Cities2, imprimindo o nome de um de cada vez. O segundo é mais parecido com uma contagem para o laço; a expressão $ # Cities3 retorna o (escalar) valor que é o índice do último elemento da lista @ Cities3. Consequentemente, este ciclo é realmente foreach $ i (0, 1, 2) (... ); Este ciclo novamente usa indexação estilo matriz para extrair elementos de dados da lista. Finalmente, a lista $ Cities4 é impresso duas vezes. A primeira instrução de impressão tem a lista em uma seqüência interpolada, o que imprime os elementos separados por espaços. Os resultados de impressão final declaração em uma linha com todos os elementos de dados concatenado em uma cadeia longa (não ser uma forma muito útil de saída, apenas uma outra característica do sistema de Perl). Listas podem ser concatenadas:

@ Masculino = qw (Mickey, Donald); @ Feminino = qw (Minnie Margarida); @ DisneyMob = (@ Masculino, Feminino @, "Pluto");

Isso produz uma lista de nível único (não-Lisp como uma lista de listas):

Mickey, Donald, Minnie, Margarida, Pluto matrizes pode ser "cortado" para dar subarrays: @ linha = qw (um, dois, três e quatro); firsttwo @ @ = linha [0,1]; @ line [0,1] = ( "cinco", "seis");

ou podem ter valores empurrado e bateu:

@ stack = (); push (@ pilha ", um"); push (@ pilha, "dois"); push (@ pilha, 3, 4); push (@ pilha, 5, 6, 7, 8, " nove ", 101); print @ pilha," \ n "; $ val = pop (@ lista); print" @ pilha \ n ";

(turnos e unshift de forma semelhante, operando no início e não o fim de uma lista. Você pode combinar empurrando e etc deslocando para alcançar algo como uma dupla fila.) A função inversa devolve uma cópia da lista com os elementos em ordem inversa. Por padrão, a função usa um tipo de classificação de periódicos, tratamento de todos os elementos da lista como cordas, novamente ele retorna uma nova lista.

@ newRevList = reverse (@ aList); @ list1 = qw (Este é um teste que mais mamã Olá Mundo Hi etc etc); # Imprime como: List1: Este é um teste que mais mamã Olá Mundo Hi etc etc tipo peform # lista, em seguida, imprimir ordenadas; letras maiúsculas rank # inferiores letras minúsculas ... Ordenado: Olá Olá Esse mundo é muito mais etc etc mãe o que é teste # Alguns dados numéricos @ list2 = (100, 26, 3, 49, -11 , 3001, 78);
# Sorted! (Em ordem alfabética) Ordenadas: -11 100 26 3 3001 49 78

O comportamento de classificação padrão de classificação alfabética pode ser modificado, você tem que fornecer seu próprio sub-rotina auxiliar de classificação. As funções de auxiliar de triagem são um pouco atípico de rotinas definidas pelo usuário, mas eles não são difíceis de escrever. Sua rotina será chamada para retornar o resultado de uma operação de comparação em dois elementos da matriz - estes elementos foram colocados em variáveis globais $ ae $ b, antes da chamada para a sua rotina. (Este uso de determinadas variáveis globais é o que faz com que essas rotinas de classificação diferente da definida pelo programador outras rotinas.) O código a seguir ilustra a definição ea utilização de uma rotina auxiliar tipo 'numeric_sort'.

#! / share / bin / perl-w numeric_sort sub (if ($ a <b) (return -1;) elsif ($ a == $ b) (return 0;) else (return 1;)) @ list2 = (100, 26, 3, 49, -11, 3001, 78); @ slist2 = sort @ list2; List2 print "@ list2 \ n"; impressão "Ordenado List2 classificação padrão () @ slist2 \ n"; @ nlist2 = numeric_sort classificar @ list2; impressão "Ordenado List2 tipo (numérico) @ nlist2 \ n";

Perl tem uma especial operador <=> para comparações numéricas; usando este operador, a função de ordenação numérica poderia ser simplificado:

numeric_sort sub (@ a <=> $ b)

Perl permite a definição de linha de funções auxiliares de classificação, permitindo construções como:

@ nlist2 sort = ($ a <=> $ b) @ list2;
um artigo submetido por Sarah Miller


Isenção de responsabilidade:O nosso site não se responsabiliza pelo conteúdo deste artigo. Webarticles é uma fonte de informação livre.
Importante: Este artigo "Listas e matrizes" foi traduzida por um software automático. Nós sentimos muito por quaisquer erros de ortografia que pode ter ocorrido. Obrigado pela sua compreensão.


Online: 326 users browsing the articles directory