Re: [Rio-pm] Ajuda com split

2013-03-18 Por tôpico Guilherme Alves
Pessoal,

obrigado pela ajuda.
Resolvi o meu problema. O problema era uns tabs que tinha no inicio de cada
linha, e eu estava tratando isto como espaço.
Apenas para registro, o código ficou assim:


use strict;
use warnings;

my $var1;
my $var3;
my $linha;
my $var2;

open(my $file, '<', 'texto.txt');
foreach $linha (<$file>) {
chomp($linha);

($var1,$var2,$var3) = split(/[\/\s+]/,$linha,3);

print "Var1 $var1 var2 $var2 var3: $var3\n";
}



2013/3/18 breno 

> (nossa, achei que só eu não dormia por aqui :D)
>
>
> Areal, não estou conseguindo reproduzir o seu problema:
>
> ---8<---
> use strict;
> use warnings;
>
> while (my $linha = ) {
>   chomp $linha;
>   my (@vars) = split '/|\s' => $linha, 3;
>   use DDP; p @vars;
> }
>
> __DATA__
> 25/Bla Primeira Entrada
> 2/Tal Segunda Entrada de Texto
> --->8---
>
> Ao executar isso, os dados parecem bem separados e sem a quebra de
> linha no final:
>
> [
> [0] 25,
> [1] "Bla",
> [2] "Primeira Entrada"
> ]
> [
> [0] 2,
> [1] "Tal",
> [2] "Segunda Entrada de Texto"
> ]
>
> Dito isso, também gosto da solução do Ole de fazer o match completo e
> agrupar os valores. Se estiver usando um Perl 5 versão 10.0 ou
> superior, pode até mesmo agrupar com nomes, por exemplo: (?\w+)
> coloca o dado em $+{foo}. É mais fácil do que $1, $2, $3, ... :-)
>
> []s
>
> -b
>
> 2013/3/18 Guilherme Alves :
> > Opa,
> >
> > esqueci de falar.. achei alguma parada na net para colocar isto logo
> depois.
> >
> > $var3=$var3.$/;
> >
> >
> > e por isto funcionou com o + antes do ]
> >
> >
> > abs
> >
> > 2013/3/18 Ole Peter Smith 
> >>
> >> o +antes de ] duvidoo.
> >>
> >> 0le
> >>
> >>
> >> 2013/3/18 Guilherme Alves 
> >>>
> >>> Só para registrar.
> >>> Fiz isto:
> >>>
> >>> ($var1,$var2,$var3) = split(/[\/\s+]/,$linha,3);
> >>>
> >>>
> >>> Estou conseguindo pegar separando direitinho, porém a $var3 está
> pegando
> >>> uma quebra de linha.
> >>> Já tentei dar até 2 vezes o chomp($linha) antes do split.
> >>> Alguém sabe me dizer o pq disto estar acontecendo?
> >>>
> >>>
> >>> Obrigado!
> >>>
> >>>
> >>> 2013/3/18 Guilherme Alves 
> 
>  Opa,
> 
>  eu fiz primeiro desta forma, pegando o primeiro espaço e depois
>  separando o que tem o /
>  Posso sim garantir que terá apenas uma barra.
>  Depois mudei para separar primeiro pelo / e depois pelo espaço pois
>  estava dando um problema estranho com a quebra de linha.
> 
>  Enfim. Resolvi o problema. Só que eu gostaria de aprender a fazer isto
>  de uma maneira mais simples, onde eu passaria as 3 variáveis de uma
> só vez.
> 
>  Desta forma eu poderia adaptar fácil para outros casos.. onde por
>  exemplo:
>  Primeira entrada - 25/Bla
>  Segunda Entrada de Texto  -  2/Tal
> 
> 
>  Abs
> 
> 
>  2013/3/18 Ole Peter Smith 
> >
> > eu fazia o split(/\s+/,..) primeiro e depois o split(/[\\\/]/,...)
> > depois (ou melhor ainda: if (=~/[\\\/]/...).
> >
> > 0le
> >
> >
> > 2013/3/18 Ole Peter Smith 
> >>
> >> somente se vc pode garantir que nao ha mais '/' nos strings... caso
> >> sim, tera que tratar isso.
> >>
> >> 0le
> >>
> >>
> >> 2013/3/18 Guilherme Alves 
> >>>
> >>> Caros Monges,
> >>>
> >>> venho aqui pedir ajuda de vocês para solucionar o meu problema.
> >>>
> >>> Tenho o seguinte arquivo de texto:
> >>> --DATA
> >>> 25/Bla Primeira Entrada
> >>> 2/Tal Segunda Entrada de Texto
> >>> --DATA
> >>>
> >>> Gostaria de fazer com que o texto fique com:
> >>>
> >>> $var1=25
> >>> $var2=Bla
> >>> $var3=Primeira Entrada
> >>>
> >>> e
> >>>
> >>> $var1=2
> >>> $var2=Tal
> >>> $var3=Segunda Entrada de Texto
> >>>
> >>> Para isto fiz um loop para o tratamento de cada linha. No momento
> uso
> >>> 2 splits (um para o "/"e outro para o primeiro espaço em branco)
> >>>
> >>> ($var1,$lixo) = split("/",$linha);
> >>> ($var2,$var3) = split(/\s+/,$lixo,2);
> >>>
> >>> Isto funciona porém o $var3 está ficando estranho, possuindo
> quebras
> >>> de linhas e tal.
> >>>
> >>> Gostaria de saber se existe alguma maneira de eu fazer este split
> >>> todo de uma só vez, tipo:
> >>> ($var1,$var2,$var3) = split("/\s+",$linha,3);
> >>>
> >>>
> >>> Obrigado pela ajuda..
> >>>
> >>>
> >>>
> >>> --
> >>> Guilherme Alves
> >>>
> >>> Redes, Sites e Sistemas(RSS) - GRIS-DCC-UFRJ
> >>> Grupo de Resposta a Incidentes de Segurança
> >>> Conheça o GRIS em www.gris.dcc.ufrj.br
> >>>
> >>> ___
> >>> Rio-pm mailing list
> >>> Rio-pm@pm.org
> >>> http://mail.pm.org/mailman/listinfo/rio-pm
> >>
> >>
> >>
> >>
> >> --
> >> /
> >>   

Re: [Rio-pm] Ajuda com split

2013-03-18 Por tôpico breno
(nossa, achei que só eu não dormia por aqui :D)


Areal, não estou conseguindo reproduzir o seu problema:

---8<---
use strict;
use warnings;

while (my $linha = ) {
  chomp $linha;
  my (@vars) = split '/|\s' => $linha, 3;
  use DDP; p @vars;
}

__DATA__
25/Bla Primeira Entrada
2/Tal Segunda Entrada de Texto
--->8---

Ao executar isso, os dados parecem bem separados e sem a quebra de
linha no final:

[
[0] 25,
[1] "Bla",
[2] "Primeira Entrada"
]
[
[0] 2,
[1] "Tal",
[2] "Segunda Entrada de Texto"
]

Dito isso, também gosto da solução do Ole de fazer o match completo e
agrupar os valores. Se estiver usando um Perl 5 versão 10.0 ou
superior, pode até mesmo agrupar com nomes, por exemplo: (?\w+)
coloca o dado em $+{foo}. É mais fácil do que $1, $2, $3, ... :-)

[]s

-b

2013/3/18 Guilherme Alves :
> Opa,
>
> esqueci de falar.. achei alguma parada na net para colocar isto logo depois.
>
> $var3=$var3.$/;
>
>
> e por isto funcionou com o + antes do ]
>
>
> abs
>
> 2013/3/18 Ole Peter Smith 
>>
>> o +antes de ] duvidoo.
>>
>> 0le
>>
>>
>> 2013/3/18 Guilherme Alves 
>>>
>>> Só para registrar.
>>> Fiz isto:
>>>
>>> ($var1,$var2,$var3) = split(/[\/\s+]/,$linha,3);
>>>
>>>
>>> Estou conseguindo pegar separando direitinho, porém a $var3 está pegando
>>> uma quebra de linha.
>>> Já tentei dar até 2 vezes o chomp($linha) antes do split.
>>> Alguém sabe me dizer o pq disto estar acontecendo?
>>>
>>>
>>> Obrigado!
>>>
>>>
>>> 2013/3/18 Guilherme Alves 

 Opa,

 eu fiz primeiro desta forma, pegando o primeiro espaço e depois
 separando o que tem o /
 Posso sim garantir que terá apenas uma barra.
 Depois mudei para separar primeiro pelo / e depois pelo espaço pois
 estava dando um problema estranho com a quebra de linha.

 Enfim. Resolvi o problema. Só que eu gostaria de aprender a fazer isto
 de uma maneira mais simples, onde eu passaria as 3 variáveis de uma só vez.

 Desta forma eu poderia adaptar fácil para outros casos.. onde por
 exemplo:
 Primeira entrada - 25/Bla
 Segunda Entrada de Texto  -  2/Tal


 Abs


 2013/3/18 Ole Peter Smith 
>
> eu fazia o split(/\s+/,..) primeiro e depois o split(/[\\\/]/,...)
> depois (ou melhor ainda: if (=~/[\\\/]/...).
>
> 0le
>
>
> 2013/3/18 Ole Peter Smith 
>>
>> somente se vc pode garantir que nao ha mais '/' nos strings... caso
>> sim, tera que tratar isso.
>>
>> 0le
>>
>>
>> 2013/3/18 Guilherme Alves 
>>>
>>> Caros Monges,
>>>
>>> venho aqui pedir ajuda de vocês para solucionar o meu problema.
>>>
>>> Tenho o seguinte arquivo de texto:
>>> --DATA
>>> 25/Bla Primeira Entrada
>>> 2/Tal Segunda Entrada de Texto
>>> --DATA
>>>
>>> Gostaria de fazer com que o texto fique com:
>>>
>>> $var1=25
>>> $var2=Bla
>>> $var3=Primeira Entrada
>>>
>>> e
>>>
>>> $var1=2
>>> $var2=Tal
>>> $var3=Segunda Entrada de Texto
>>>
>>> Para isto fiz um loop para o tratamento de cada linha. No momento uso
>>> 2 splits (um para o "/"e outro para o primeiro espaço em branco)
>>>
>>> ($var1,$lixo) = split("/",$linha);
>>> ($var2,$var3) = split(/\s+/,$lixo,2);
>>>
>>> Isto funciona porém o $var3 está ficando estranho, possuindo quebras
>>> de linhas e tal.
>>>
>>> Gostaria de saber se existe alguma maneira de eu fazer este split
>>> todo de uma só vez, tipo:
>>> ($var1,$var2,$var3) = split("/\s+",$linha,3);
>>>
>>>
>>> Obrigado pela ajuda..
>>>
>>>
>>>
>>> --
>>> Guilherme Alves
>>>
>>> Redes, Sites e Sistemas(RSS) - GRIS-DCC-UFRJ
>>> Grupo de Resposta a Incidentes de Segurança
>>> Conheça o GRIS em www.gris.dcc.ufrj.br
>>>
>>> ___
>>> Rio-pm mailing list
>>> Rio-pm@pm.org
>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>>
>> --
>> /
>>  ( O O )
>> =oOO==(_)==OOo=
>> Every day and every hour, I'm Learning more
>>   The more I Learn, the less I Know about before
>>  The Less I know, the more I want to Look around
>>  Diggin' deeper into Higher Ground...  UB40
>>.oooO Oooo.
>> ==( )=( )=
>>  \  ( )  /
>>   \_)   (_/
>> ===
>> Ole Peter Smith, IME, UFG
>> http://olepeter.mat.ufg.br  - ole at mat.ufg.br
>> ===
>>>