[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