Receitas
Instalando o DBD::Oracle com o instant client + sdk
Problema Instalar o DBD::Oracle Solução Instalar o instant client ao invés do client completo, configurar o ambiente e compilar o DBD::Oracle Discussão Introdução Frequentemente vejo em listas de perl a dificuldade de muitas pessoas em instalar o DBD::Oracle, ou porque não conseguem instalar o pr ... ver artigo completo
Como fazer parsing de HTML
Problema Extrair informacões de um arquivo HTML Solução use HTML::TreeBuilder Discussão Você poderia usar uma simples expressão regular para extrair informacões de um arquivo HTML. Mas, porque fazer isso se existe um módulo que permite ir diretamente à informacão desejada? O HTML::TreeBuilder faz o ... ver artigo completo
Exibir caracteres UTF-8 no Windows
Problema Você está trabalhando com dados codificados em UTF 8 mas o terminal do Windows não consegue exibir o texto corretamente. Solução Basta mudar a codificação de página do terminal do Windows para 65001. Discussão Certo, isso não é exatamente uma receita de Perl, mas o problema é freqüente o bastante ... ver artigo completo
Como descobrir se um item está contido em um array?
Problema Você quer descobrir se um determinado elemento está contido dentro de um array. Solução Use um hash. Discussão Sempre que você ler a expressão "contido em", esta é uma indicação de que você deveria ter usado um hash ao invés de um array. O hash permite descobrir esta informação imediatamente ... ver artigo completo
Como ler arquivos codificados em UTF-16
Problema Você está tentando ler um arquivo texto codificado em UTF 16 mas está recebendo mensagens de aviso com "wide character" mesmo já tendo informado que o arquivo está codificado em UTF 16. Solução A implementação do Perl para lidar com UTF 16 desconsidera a presença de BOM ( Bit Order Mark ... ver artigo completo
Fazendo um HelloWorld falar vários idiomas
Problema Como fazer um sistema com suporte a L10N? Você precisa que seu sistema tenha suporte a vários idiomas e que novos idiomas sejam adicionados a qualquer momento? Solução Utilize o módulo em conjunto com http://search.cpan.org/~audreyt/Locale Maketext Lexicon Locale::Maketext::Lexicon. Discuss ... ver artigo completo
Como ler arquivos do Excel mais rapidamente
Problema Você quer ler um arquivo do MS Excel com grande quantidade de registros e colunas com Win32::OLE mas o resultado é mais lento do que você gostaria. Solução Use o método Range para obter todos os valores das linhas/colunas de uma só vez. Discussão Ao invés de utilizar dois loops dentro ... ver artigo completo
Como criar arquivos PDF utilizando Template-Toolkit
Problema Voce precisa gerar arquivos PDF através do sistema de templates Template Toolkit . Solução Utilize o plugin Template::Plugin::Latex. Discussão Esta pode não ser a forma mais fácil e rápida de criar PDFs utilizando Perl, mas com certeza é uma grande vantagem para quem já conhece a linguagem ... ver artigo completo
Como criar um array de n elementos iguais
Problema Você quer criar uma array com "n" elementos iguais. Solução my @foo (1) x 100; Discussão Para criar um array pequeno, os valores poderiam ser definidos individualmente: my @foo (1, 1, 1, 1, 1, 1, 1, 1, 1); A desvantagem desse método, para além do fato de exigir tantas entradas quantas ... ver artigo completo
Parse de Endereços em Perl
A partir de uma discussão na cascavel pm (http://mail.pm.org/pipermail/cascavel pm/2007 March/009129.html), discutimos como fazer ETL de Endereços em uma base de dados não estruturada para uma base de dados com o endereço estruturado. Definindo o problema Para definir o problema, vamos definir um conjunto ... ver artigo completo
Gerar uma cadeia de caracteres aleatoriamente
Problema Você precisa criar uma string aleatória e arbitrariamente longa contendo um certo conjunto qualquer de caracteres prédefinidos. Solução Mapeie cada elemento de um array com o tamanho da string (em caracteres) que você deseja obter para um caracter obtido aleatoriamente do conjunto de caracteres ... ver artigo completo
Como descobrir a diferença ou a intersecção entre dois arrays
Problema Você precisa descobrir quais elementos de uma lista estão presentes em uma outra lista; ou quais elementos estão presentes em apenas uma das listas. Solução Use um hash. Discussão Sempre que você estiver lidando com conjuntos (o que é frequentemente indicado por expressões tais como "presente ... ver artigo completo
Como pesquisar os valores de um hash?
Problema Você gostaria de pesquisar os valores (e não as chaves!) de um hash. Solução Crie um hash reverso. Discussão Para criar um hash reverso: %by value reverse %by key; $key $by value{$value}; Isso pode não ser muito eficiente por duplicar a quantidade de dados. Se isso for um problema ... ver artigo completo
Como remover os elementos duplicados de uma lista
Problema Você precisa remover todos os elementos duplicados de uma lista. Solução Use um hash. Discussão Se a sua lista está ordenada, você pode remover os elementos iguais adjacentes (semelhante ao uniq do unix): undef $prev; @out grep($ ne $prev ($prev $ , 1), @in); Na maioria dos ... ver artigo completo
Como obter n caracteres de uma string
Problema Como faço para obter n caracteres de uma string? Solução Use substr() ou pack(). Discussão substr() permite obter ou mesmo modificar um pedaço de uma string: # substr EXPR,OFFSET,LENGTH # substr EXPR,OFFSET print substr(qwerty, 0, 3); # imprime "qwe" print substr(qwerty, 0, 3 ... ver artigo completo
Como comparar duas datas
Problema Você quer encontrar a diferença entre duas datas. Solução Converta as datas para "epoch seconds", ou use o módulo Date::Calc. Discussão Se você está guardando suas datas em segundos desde a época ("epoch seconds"), você pode simplesmente substituir uma da outra. Se você tem uma data estruturada ... ver artigo completo
.vimrc para perl
Problema Você quer recursos como realce de sintaxe (syntax highlighting) , identação automática e autocompletar. Solução Configure o arquivo .vimrc no seu diretório $HOME. Discussão Existem inúmeras configurações possíveis com o vim. Este arquivo .vimrc ativa algumas delas: " " general preferences ... ver artigo completo
Como ler um caractere
Problema Você quer que o programa leia um caractere da entrada padrão, ou de outro filehandle. Solução use Term::ReadKey; Discussão Term::ReadKey is a compiled perl module dedicated to providing simple control over terminal driver modes (cbreak, raw, cooked, etc.,) support for non blocking reads, if ... ver artigo completo
Como ler o conteúdo de um arquivo de uma vez
Problema Você quer ler um arquivo inteiro e colocá lo na memória. Solução @file ; ou use File::Slurp; Discussão Antes de continuar a leitura, é importante considerar o seguinte: você tem certeza de que de precisa colocar todo o conteúdo do arquivo na memória, de uma vez? Se isto for realmente necess ... ver artigo completo
Como ler um arquivo por parágrafos
Problema Você quer ler um arquivo por parágrafos ("\n\n") ao invés de linhas. Solução Redefina $/. Por exemplo: $/ "\n\n"; Discussão A variável $/ ($INPUT RECORD SEPARATOR) define o separador de linhas padrão de arquivos. Normalmente o separador é "\n" (exceto no DOS/Windows, onde é "\r\n"), mas ... ver artigo completo
Como fazer um tail -f em perl
Problema Você quer que o programa leia fique lendo o final de um arquivo que está sendo continuamente atualizado, à espera de novas linhas. Solução use File::Tail; Discussão O módulo File::Tail permite ler o final de um arquivo enquanto ele está sendo escrito: use File::Tail; $file File::Tail ... ver artigo completo
Como fazer qualquer coisa em Perl
Problema Você precisa fazer alguma coisa qualquer coisa em Perl. Solução Leia a documentação. Pesquise o CPAN. Entre no IRC e participe das listas de discussão. Discussão Antes de escrever sua primeira linha de código, veja se você não encontra um módulo correspondente no CPAN: http://search ... ver artigo completo
Como expandir variáveis dentro de uma string
Problema Você tem uma string contendo nomes de variáveis que não foram expandidas: $text 'foo é $foo e bar é $bar'; ...e gostaria de substituir as variáveis por seus valores em tempo de execução. Solução Coloque as variáveis dentro de um hash e use a expressão regular para substitui las por seu valor ... ver artigo completo
Como tornar expressões regulares mais legíveis
Problema Expressões regulares normalmente são difíceis de ler. Como torná las mais legíveis? Solução Use delimitadores diferentes; utilize o sufixo /x. Discussão Quando precisamos lidar com padrões que incluem o caractere "/", podemos mudar o delimitador para tornar a expressão regular mais clara: ... ver artigo completo
Como detectar e tratar erros em tempo de execução
Problema Você quer detectar e tratar erros em tempo de execução, de forma que seu programa não seja interrompido. Solução Use eval{} para executar o código; se houver algum erro, ele será capturado na variável de erro $@. Discussão Se você executar o código: open FILE, "arquivo.txt" or die "Erro ... ver artigo completo
Como criar estruturas de dados complexas
Problema Você precisa lidar com uma estrutura de dados composta por diversas combinações de escalares, arrays e hashes. Solução Use referências. Discussão Normalmente uma referência para um hash, como por exemplo: $record { NAME "Jason", EMPNO 132, TITLE ... ver artigo completo
Como modificar uma linha específica de um arquivo
Problema Você quer modificar uma linha específica de um arquivo texto. Solução use Tie::File; Discussão O módulo Tie::File permite acessar as linhas de um arquivo como se fossem um array. A primeira linha do arquivo é o elemento 0 do array; a segunda linha é o elemento 1, e assim por diante. Mudan ... ver artigo completo
Como converter números para valores por extenso
Problema Você tem um número e deseja convertê lo para palavras em língua portuguesa. (Por exemplo: 999 novecentos e noventa e nove) Solução use Lingua::PT::Nums2Words; Discussão Nums2Words converte número para palavras em língua portuguesa. Trabalha com números de 0 até 999.999.999.999.999 (de ... ver artigo completo
Como copiar um arquivo
Problema Você precisa copiar um arquivo. Solução use File::Copy; Discussão A primeira solução que poderia vir à mente é usar uma chamada ao sistema operacional (system() ou backticks). Mas esta solução não é portável. A melhor solução é usar o módulo File::Copy, que vem com Perl e pode fazer uma c ... ver artigo completo
Como processar um arquivo com conteúdo do tipo "chave: valor"
Problema Precisamos processar um arquivo com este conteúdo: nome: Fulano de Tal email: tal.fulano #64;empresa.com url: http://www.empresa.com nome: Beltrano de Outrem email: outrem.beltrano #64;outraempresa.com.br url: http://www.outraempresa.com.br Solução Você pode utilizar uma estrutura de hashes ... ver artigo completo
Como contar o número de ocorrências de uma string
Problema Você quer saber quantas vezes uma string aparece dentro de uma outra. Solução Use uma expressão regular global e conte o número de ocorrências. Discussão O que você pode fazer é colocar um while() ao redor de uma expressão regular de substituição global. Por exemplo, vamos contar os números ... ver artigo completo
Como comparar duas datas
Problema Você quer encontrar a diferença entre duas datas. Solução Converta as datas para "epoch seconds", ou use o módulo Date::Calc. Discussão Se você está guardando suas datas em segundos desde a época ("epoch seconds"), você pode simplesmente substituir uma da outra. Se você tem uma data estruturada ... ver artigo completo
