Cada linha de saída consiste de uma lista de palavras

Estas linhas têm de ser classificados usando uma ordem alfabética, que usa a sub-string a partir de palavra-chave. A palavra-chave é iniciado após a coluna 50, por isso exigimos uma rotina auxiliar especiais de classificação que escolhe esses sub-strings. A rotina de ordenação é semelhante ao numeric_sort ilustrado anteriormente. Baseia-se na convenção que, antes que a rotina é chamada, as variáveis globais $ ae $ b terá sido atribuído a dois elementos de dados (neste caso as linhas de relatório) que deve ser comparado.

by_keystr sub (my $ str1 = substr ($ a, 50); my $ str2 = substr ($ b, 50); if ($ str1 lt $ str2) (return -1;) elsif ($ str1 eq $ str2) ( return 0;) else (return 1;))
  

Esta rotina exige que as variáveis locais para armazenar os dois sub-strings. Perl permite a declaração de variáveis cujo escopo é limitado ao corpo de uma função (ou, no escopo de um bloco interno no qual eles são declarados). Estas variáveis são declaradas com a palavra minha, aqui a função de auxiliar de classificação tem duas variáveis locais str1 $ e $ str2. Estes contêm a sub-strings começando na posição 50 das duas linhas geradas. A lt e comparações eq feito sobre estas seqüências pode ser simplificada usando operador Perl CMP (é uma versão seqüência do operador mencionado no contexto da função de auxiliar de classificação numérica). O corpo do loop principal, enquanto trabalha, dividindo a linha de entrada em uma lista de palavras e, em seguida, o processamento desta lista.

while ($ title = ) (Chomp ($ title); @ Title = split / /, $ title, ... foreach $ i (0 .. $ # Título) ($ palavra = $ titulo [$ i]; ... ))

Cada palavra deve ser testado para determinar se se trata de uma palavra-chave. Isso pode ser feito usando um jogo simples expressão regular. O padrão desta expressão regular especifica que deve haver uma letra maiúscula no início da seqüência realizada em $ Word: if ($ palavra = ~ / ^ [AZ] /) (... = ~) O operador é expressão regular do Perl matching operador, que é usado para chamar a comparação do valor de R $ Word e / ^ [AZ] / pattern. Se a palavra atual é classificada como uma palavra-chave, então as palavras antes de são combinados para formar a seqüência de início, e as palavras-chave e palavras restantes são combinados para formar uma seqüência final. Essas seqüências podem ser combinadas para produzir uma linha para a saída final. Isto é conseguido usando a função sprintf (o mesmo que na biblioteca stdio C's). A função sprintf cria uma seqüência na memória, retornando essa seqüência como seu resultado. Like printf, sprintf tem uma seqüência de formato e uma lista de argumentos. As linhas de saída mostrada pode ser produzido usando a instrução:

linha $ end = sprintf "% 50s%-50s \ n", $ start, $;

A programação completa é a seguinte:

#! / elsif usr / bin / perl by_keystr sub (my $ str1 = substr ($ a, 50); my $ str2 = substr ($ b, 50); if ($ str1 lt $ str2) (return -1;) ($ str1 eq $ str2) (return 0;) else (return 1;)
) @ Coleção title = (); while ($ = ) (Chomp ($ title); @ Title = split / /, $ title, $ start = ""; foreach $ i (0 .. $ # Título) ($ palavra = $ titulo [$ i]; if ($ Word = ~ / ^ [AZ] /) ($ end = ""; for ($ j = $ i, $ j 

Em Perl, há sempre uma outra maneira! Outra forma de construção da lista final $ usaria Perl aderir função:

$ end = join '' Title [$ i .. $ # Título];

Perl Função Join (documentado em perlfunc) tem dois argumentos - uma expressão e uma lista. Ele cria uma cadeia unindo as cadeias separadas da lista, eo valor da expressão é usada como elemento separador. Perl vem com bibliotecas de vários milhares de sub-rotinas, muitas vezes a maioria de seu trabalho pode ser feito usando rotinas existentes. No entanto, você precisa definir sua própria rotina - se simplesmente arrumar acima de seu código e evitar excessivamente grandes programas da linha principal. Rotinas Perl são definidas como:

nome do bloco sub

A rotina tem um valor de retorno, isto é, quer o valor da última instrução executada ou um valor especificado em uma instrução de retorno explícito. Argumentos passados para uma rotina são combinados em uma única lista - @ _. Argumentos individuais podem ser isoladas pela indexação nesta lista, ou usando uma lista literal como uma lvalue. Como ilustrado com a função de auxiliar de classificação na última parte, subrotinas pode definir o seu âmbito próprio local variables.Many mais detalhes de sub-rotinas são dadas na parte perlsub da documentação. Parênteses são completamente opcionais em chamadas de subrotina:

Process_data ($ arg1, $ arg2, $ arg3); é o mesmo que Process_data $ arg1, $ arg2, $ arg3;

A definição de tal rotina é a seguinte:

octal sub (my $ str = $ _ [0]; my $ code = 0; for (my $ i = 1; $ i 

Esta rotina pode ser invocada:

rwxr $ str = "--x ---"; $ accessCode octal = $ str;

Para um segundo exemplo, considere uma rotina para determinar se uma determinada string está presente em uma lista:

item (membro, list);

Como mencionado acima, os argumentos para uma rotina são combinados em uma única lista, pois eles tem que ser separado na rotina. O tratamento envolve um loop foreach que verifica se o membro da lista seguinte é igual a seqüência desejada:

Membro sub (my ($ entrada, @ list) = @ _; # separar os argumentos foreach $ memb (@ lista) (if (eq $ memb $ entrada) (return 1;))
return 0;)

Na verdade, existe uma outra maneira. Não há necessidade de inventar uma rotina Perl membro porque já possui uma versão generalizada em sua rotina grep. Datalist match_criterion grep Quando usado em um contexto de lista, grep produz uma sub-lista com referências aos membros do DataList que satisfazem o teste. Quando usado em um contexto escalar, grep retorna o número de membros do DataList que satisfaçam as exigências.

um artigo submetido por Jorge Martinez


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 "Cada linha de saída consiste de uma lista de palavras" 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: 282 users browsing the articles directory