[SP-pm] ER para separar o primeiro e o último campo de um registro.
Andre Carneiro
andregarciacarneiro at gmail.com
Mon Dec 22 10:01:06 PST 2008
2008/12/22 Wagner Arbex <arbex at arbex.pro.br>
> Prezados Monges... estou com um pequeno prob com ERs e tenho certeza de
> que é trivial, mas agarrei.
>
> Vou dar um exemplo simplificado. Tenho um arquivo com vários registro
> que pode ser, por ex:
>
> 1 ABC X Y CDA 40
> 5 XYZ - U BBB 0
> 8 --- T C CTT 80
>
> E gostaria de gravar um arquivo com:
>
> 1,40
> 5,0
> 8,80
>
Não entendi o objetivo aqui. Se puder ser mais claro seria bom.
>
> O que eu preciso é ler esse arquivo e separar o primeiro e o último
> campo para gravá-los em outro arquivo, seria +-
Pois é, o texto em cima eu entendi, mas não entendi o seu exemplo... está
meio estranho. O que você precisa separar dentro do arquivo exatamente. Dê
um exemplo real, se possível.
Quanto a ER, você precisa identificar o que está separando o primeiro e o
último caracter, por exemplo, suponha que a entrada seja algo assim:
<arquivo_fictício>
campo1 campo2
</arquivo_fictício>
O que é separado aqui é o espaço. Se eu quiser usar expressões regulares
para separar isso e guardar em duas variáveis, eu poderia fazer assim, por
exemplo:
<code>
use strict;
open my $fh,'<','caminho_para/meuarquivo.txt' or die $!; #Apenas didático.
Não se deve tratar esse tipo de erro com die.
while(<$fh>){
my $linha = $_;#Evite trabalhar com $_ diretamente, a menos que
você saiba exatamente o que você está fazendo. Toda a vez que o while
iterar, $_ conterá uma nova linha do arquivo, então preste atenção para não
sobrescrever valores em variáveis ou algo do tipo.
chomp $linha; #Remove o terminador do final da string(se houver)
my ($campo1,$campo2) = split /\ +/,$linha;# split é uma função
nativa de perl, que faz com que tudo o que está antes e depois do
padrão(nesse caso, o padrão é um espaço ou '+'), seja separado em uma
lista. No caso, a minha lista compreende o agrupamento(os parênteses) das
variáveis $campo1 e $campo2.
print "\n\nCAMPO1: $campo1\nCAMPO2: $campo2";#imprime o resultado.
}
close $fh;
__END__;
</code>
Existem várias outras formas de fazer, Se você não entendeu, ou se eu não
entendi o seu problema, volte a postar por aqui.
> while ( <ARQ1> ) {
> chomp;
>
> my $primeiro = $_;
>
> $primeiro =~ s/\s.*//; # OK... esse funciona.
>
> my $ultimo = $_;
Cuidado com a confusão aqui. Você está atribuindo sempre o mesmo valor para
$primeiro e $ultimo. É isso mesmo que você quer? Se não for, pense no que eu
disse sobre trabalhar diretamente com '$_'.
>
> $ultimo =~ s/.*\s.+$//; # Bom, aqui eu não sei qual a ER a ser usada.
>
Eu também não, simplesmente porque não estou entendendo o que você quer na
verdade. Essa ER aí em cima simplesmente vai anular qualquer valor que
esteja em '$ultimo', substituindo tudo, inclusive o último espaço no final
da linha, por nada. Se você queria substituir todos os espaços por nada,
poderia usar: s/\ +$//; ou s/\s+$//;
>
> print ARQ2 "$primeiro,$ultimo\n";
> }
>
> Além de me ajudarem com a ER, todas as sugestões para eu melhorar o
> código, conhecer novas estruturas, formas de fazer etc são muito bem
> vindas.
>
E eu recomendo que você comece lendo isso aqui:
http://perl.org.br/Perldoc/V500807/Perlintro
Qualquer dúvida poste aqui.
Cheers!
> []s e, desde já, obrigado.
> --
> Wagner Arbex
> Doutorando em Engenharia de Sistemas e Computacao - COPPE/UFRJ
>
> Vendo notebook - http://www.arbex.pro.br/
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm at pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
--
André Garcia Carneiro
Analista/Desenvolvedor Perl
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20081222/a9060913/attachment-0001.html>
More information about the SaoPaulo-pm
mailing list