Os arquivos texto gerados no Windows/DOS normalmente terminam por '\r\n', o que pode ser um problema. Para tratar esta situação pode-se usar uma expressão regular:
$registro =~ s/\r//g;
Exemplo:
while ($registro = <STDIN>) {
$registro =~ s/\r//g;
chomp($registro);
}
PS. Valeu Dárcio!
Mostrando postagens com marcador perl. Mostrar todas as postagens
Mostrando postagens com marcador perl. Mostrar todas as postagens
sexta-feira, 4 de setembro de 2015
terça-feira, 17 de junho de 2014
Perl - Eliminar Carriage Return e o Line Feed de arquivos
Existem situações em que devemos eliminar um Carriage Return (CR ou \r ou 0A) e um Line Feed (LF ou \n ou 0D) de um arquivo.
Um exemplo fazendo isto em Perl:
#!/usr/bin/perl -w
while (my $linha = <>) {
if ($linha =~ /[0-9]\x0D\x0A/) {
chop $linha;
chop $linha
}
print $linha;
};
exit;
No exemplo acima, o Carriage Return e o Line Feed somente são excluídos quando forem precedidos por um número.
Um exemplo fazendo isto em Perl:
#!/usr/bin/perl -w
while (my $linha = <>) {
if ($linha =~ /[0-9]\x0D\x0A/) {
chop $linha;
chop $linha
}
print $linha;
};
exit;
No exemplo acima, o Carriage Return e o Line Feed somente são excluídos quando forem precedidos por um número.
terça-feira, 25 de junho de 2013
Remoção de NEWLINE no meio de arquivo
Script AWK para remover caracteres 'newline' do meio de uma linha, a partir de um arquivo compactado e gerando um novo arquivo compactado:
gzip -dc arquivo.Z | awk -F'^' 'BEGIN{c=1}$0!=""{printf("%s",$0); if(NF+c>=243){printf("\n");c=1}else{c=NF}}' | gzip > arquivosaida.txt.gz
Versão em Perl
gzip -dc arquivo.Z | perl -e '$c=1;while(<STDIN>){$_=~s/\r|\n//g; if($_!=""){ @a = split("\\^", $_); print $_; if(($#a)+$c>=243){print "\n";$c=1}else{$c=$#a+1} }}' | gzip > arquivosaida.txt.gz
Agradecimentos ao sempre presente (nerd) Jorge Amorim !!
gzip -dc arquivo.Z | awk -F'^' 'BEGIN{c=1}$0!=""{printf("%s",$0); if(NF+c>=243){printf("\n");c=1}else{c=NF}}' | gzip > arquivosaida.txt.gz
gzip -dc arquivo.Z | perl -e '$c=1;while(<STDIN>){$_=~s/\r|\n//g; if($_!=""){ @a = split("\\^", $_); print $_; if(($#a)+$c>=243){print "\n";$c=1}else{$c=$#a+1} }}' | gzip > arquivosaida.txt.gz
Agradecimentos ao sempre presente (nerd) Jorge Amorim !!
quinta-feira, 11 de outubro de 2012
Perl - Incluir diretorios ao @INC
O perl utiliza o array de ambiente @INC, que contém os diversos diretórios, para procurar os pacotes perl instalados.
Para acrescentar diretório(s) a este array (que na verdade é inacessível) podem ser utilizados 3 métodos:
O perl ao iniciar a execução de um programa acrescenta ao array @INC o contéudo desta variável.
Sintraxe:
Linux/Unix/MacOsX
export PERL5LIB=/path/to/1:/path/to/2
Windows
set PERL5LIB=<unidade>:\path\to\1;<unidade>:\path\to\2
Sintaxe:
use lib '/home/foobar/code';
use My::Module;
Sintaxe:
perl -I /path/to/module script.pl
Para acrescentar diretório(s) a este array (que na verdade é inacessível) podem ser utilizados 3 métodos:
1) Utilização da variável de ambiente PERL5LIB
Esta variável de ambiente assemelha-se a variável PATH e pode conter uma lista de diretórios.O perl ao iniciar a execução de um programa acrescenta ao array @INC o contéudo desta variável.
Sintraxe:
Linux/Unix/MacOsX
export PERL5LIB=/path/to/1:/path/to/2
Windows
set PERL5LIB=<unidade>:\path\to\1;<unidade>:\path\to\2
2) Comando use lib
Incluir no início do script/programa perl o comando use lib fará com que o perl acrescente ao array @INC este caminho.Sintaxe:
use lib '/home/foobar/code';
use My::Module;
Observe que o use lib deve ser usado antes do use dos pacotes/módulos.
3) Executar o script com a opção -I
Ao executar o script usando o comando perl, passar o parâmetro -I (i maiúsculo) com o caminho desejado. O diretório será então adicionado ao array @INC apenas para a execução deste script.
perl -I /path/to/module script.pl
Assinar:
Comentários (Atom)