Ajustando em dez Curto, Útil Programas Perl

Algumas pessoas acreditam que programas curtos não são bons para muito, mas isso não é assim com Perl. Apenas um par de linhas de código Perl pode percorrer um longo caminho. Este artigo lista alguns pequenininho acessível, pequenos programas em Perl.

Coleta de linhas exclusivas

Se o seu arquivo de texto tem muitas linhas que são duplicados e você só quer ver as linhas originais, você pode recolhê-los em uma matriz (neste caso, é chamado @Unique) com o seguinte programa:

open (IN, "somefile.txt") - @Unique = () -
enquanto() {A menos ($ i {$ _} ++) {push (@Unique, $ _)}}

O truque aqui é que $ i {$ _} ++ retorna 0 a primeira vez que você cria um par de valores-chave com $ _ como a chave, e alguns valor diferente de zero depois disso.

Livrar-se de múltiplas linhas em branco

Alguns arquivos de texto têm múltiplas, linhas em branco consecutivas, que os tornam difíceis de ler, especialmente em telas pequenas. O programa a seguir imprime um arquivo de texto, comprimindo todas as ocorrências de duas ou mais linhas em branco em uma única linha em branco.

Nota: Uma linha em branco pode ter espaços em branco na mesma, tais como espaços e as abas, mas não caracteres visualizáveis.

open (IN, "somefile.txt") - $ PrevBlank = 0-
enquanto() {
if (/ S / ou! $ PrevBlank) {print $ _}
$ PrevBlank = / ^ s * $ / -
}

A instrução if no exemplo anterior é verdadeira se houver caracteres não vazias na linha ou se a linha anterior não estava em branco. A atribuição $ PrevBlank informa se a linha atual é em branco, o que significa que ele tem zero ou mais caracteres em branco e nada mais.

Imprimir linhas de um arquivo na ordem de classificação

É fácil esquecer o quão útil função de classificação do Perl é. O programa a seguir lê o arquivo inteiro em uma matriz, classifica a matriz, e imprime o resultado. Curto e doce, e muito eficiente de boot:

open (IN, "somefile.txt") -
tipo de impressão () -

Impressão de uma gama de linhas de um arquivo

Alguma vez você já quis ler apenas algumas linhas de um arquivo, e não a coisa toda? O programa a seguir imprime apenas uma gama de linhas. Você executar o programa com dois argumentos: o intervalo que deseja eo nome do arquivo. Por exemplo, se você nomear seu programa "Showline" e você quiser ver linhas 10 a 20 do arquivo somefile.txt, você usar esta linha de comando:

Showline 10-20 somefile.txt

O programa a seguir imprime uma série de linhas:

open (IN, $ ARGV [1]) ou morrer "Não foi possível ler $ File. n" -
($ Iniciar, $ Stop) = split (/ - /, $ ARGV [0]) -
for ($ i = 1- $ ilt; = $ Stop- $ i + = 1)
{$ Linha = - if ($ i> = $ Start) {print $ Line}}

Listagem apenas os arquivos em um diretório

Às vezes, você pode querer ignorar os subdiretórios em um diretório e se concentrar apenas sobre os arquivos. Você pode usar o seguinte teste -f arquivo para listar todos os arquivos de um diretório:

foreach $ f (lt; *>) {if ($ -f f) {print "$ f n"}}

Listagem um diretório por tamanho

Para classificar, uma listagem de diretório por qualquer outra coisa do que os seus nomes, seu programa tem que manter uma lista de registros que consistem em nomes e outros itens na lista. Hashes são ótimos para usar para este tipo de lista que tem registros com uma chave (o nome do arquivo) e um valor (o outro informações de diretório). O programa a seguir cria um hash que lista o tamanho de cada arquivo no diretório e, em seguida, classifica os itens para a saída. (Você pode facilmente modificar o presente programa para classificar por data, em vez de através de tamanho.)

foreach $ f (lt; *>) {$ i {$ f} = -s $ f} -
foreach $ k (tipo {$ i {$ b} lt; = gt $ i {$ a}} chaves% i)
{Printf "% 8d% s n", $ i $ {k}, $ k}

Classificando diretórios por extensão

Classificando por uma parte do arquivo é um processo um pouco mais difícil do que a classificação por tamanho do arquivo ou até à data que o arquivo foi modificado. O programa a seguir divide o nome do arquivo em dois tipos e pela segunda parte. Se você estiver executando Perl em um sistema UNIX ou Macintosh, este programa funciona previsivelmente somente se os nomes de arquivos não possuem prazo ou um período:

foreach $ FullName (lt; *>) {
($ Nome, $ Ext) = split (/./, $ FullName, 2) -
push (@Temp, "$ Ext t $ FullName") -
}
foreach $ Val (sort (@Temp)) {
($ Ext, $ FullName) = split (/ t /, $ Val) -
imprimir "$ FullName n" -
}

Criando uma calculadora simples

Sempre necessária uma calculadora simples de usar para derrubar alguma matemática rápida e suja? O programa a seguir usa a função eval do Perl para imprimir as respostas para qualquer equação que você entra. Para terminar o programa, insira uma linha em branco. Aqui está o programa para criar a sua própria calculadora:

enquanto() {
$ I = $ _- chomp ($ i) - a menos ($ i) {último}
$ O = eval ($ i) - print "Resposta = $ o n" -
}

Quando você executa o programa, você pode digitar algo como o seguinte:

((2 ** 8) + (3 ** 8))

e você obter este resultado:

Resposta = 6817

Randomização uma lista

Em Perl, geração de números aleatórios é fácil, mas randomizing a ordem de uma matriz não é tão simples. No entanto, você pode usar a função de emenda para puxar um elemento aleatório de uma matriz e, em seguida, colocar o elemento em outro array. O programa a seguir randomizes a lista @MyList:

minha @TempList = () -
while (@MyList)
{Push (@TempList, splice (@MyList, rand (@MyList), 1))}
@MyList = @TempList;

O truque aqui é que rand (@MyList) escolhe um número entre 0 e o número de elementos em @MyList, e emenda muda este número aleatório para um inteiro.

Gerar senhas aleatórias mnemônicos

Tentando convencer os usuários de computador para chegar a senhas que não são fáceis de serem adivinhadas é um dos trabalhos mais difíceis para um administrador de sistema. As pessoas sempre parecem insistir em usar as suas datas de nascimento ou nomes dos animais de estimação para senhas - segurança violar então se torna uma brincadeira de criança.

O programa a seguir gera senhas aleatórias. Em vez de um amontoado de letras difíceis de lembrar, no entanto, as senhas são um pouco mnemônica porque eles aparecem em pares de consoantes e vogais que são pronunciável. Pelo encadeamento algumas sílabas patetas-som, você pode gerar fácil de lembrar frases sem sentido.

Cada sílaba da palavra-passe pode representar qualquer um dos 100 numbers- portanto, uma única senha de quatro sílaba, tais como votahubo, é um dos 100 milhões (100 à quarta potência) possíveis senhas o programa gera. Ter um administrador do sistema atribuir essas senhas fornece mais segurança do que permitir que os usuários escolher suas próprias senhas, facilmente descobertas:

print "Introduza um número de sementes:" - $ s =-
srand ($ s ^ tempo) -
@ C = split (/ * / ", bcdfghjklmnprstvwxyz") -
@ V = split (/ * /, "aeiou") -
for ($ i = 1- $ i lt; = 4- $ i + = 1)
{Print $ c [int (rand (20))], $ v [int (rand (5))]}

As duas primeiras linhas deste programa inicializar a semente para os números aleatórios, e as próximas duas linhas criar listas contendo os 20 consoantes (menos q) E 5 vogais do alfabeto. O loop para simplesmente imprime as quatro sílabas.

menu