[Rio-pm] Isso não deveria estar certo???

2012-12-07 Por tôpico Aureliano Guedes

Monges, cade o erro???

#!/usr/bin/env perl

use strict;
use autodie;

open my $in, , $ARGV[0];
my $contig = 0;
while (my $line = $in){
my $ctg = contig . $contig;
#print $line;
if ($line =~ /(.+)/){
print Ok\n;
$line = s/$1/$ctg/;
print $line;
$contig++;
}
}

O arquivo é algo como
blablabla
ACTGAACAGTAGCTACTGACTCGTACGCTCGTAGC
lalalala
CAGCTGATCGATCGTAGCATGCTACG
  ___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

Re: [Rio-pm] Isso não deveria estar certo???

2012-12-07 Por tôpico Junior Moraes
Hi.

Não, ué.
A regexp começa com  e no arquivo tem lalalala.

[]'s

2012/12/7 Aureliano Guedes guedes_1...@hotmail.com

 
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

Re: [Rio-pm] Isso não deveria estar certo???

2012-12-07 Por tôpico Aureliano Guedes

Ok, erro idiota no qual fiquei 1h quebrando a cabeça.
Ok!

Mas me diz uma coisa, como editar um arquivo.

Tipo queria que:

open my $in, , $ARGV[0];
my $contig = 0;
while (my $line = $in){
my $chn = contig . $contig;
if ($line =~ /(.+)/){
$line =~ s/$1/$chn/;
$contig++;
}
}

Funcionasse sem precisar fazer:

open my $in, , $ARGV[0];
my $contig = 0;
my $record = ;
while (my $line = $in){
my $chn = contig . $contig;
if ($line =~ /(.+)/){
$line =~ s/$1/$chn/;
$record .= $line;
$contig++;
}
else {
$record .= $line;
}
}
open my $out, , $ARGV[0];
print $out $record;

From: juniiior...@gmail.com
Date: Fri, 7 Dec 2012 22:25:19 -0200
To: rio-pm@pm.org
Subject: Re: [Rio-pm]   Isso não deveria estar certo???

Hi.
Não, ué.A regexp começa com  e no arquivo tem lalalala.


[]'s

2012/12/7 Aureliano Guedes guedes_1...@hotmail.com





___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm  
  ___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

Re: [Rio-pm] Isso não deveria estar certo???

2012-12-07 Por tôpico breno
Oi Aureliano,

cara, antes de tudo, parabéns. O exemplo que vc colou no email mostra
que vc está prestando atenção no que é dito aqui na lista. Seus
códigos estão agora com strict (faltou só o 'warnings', hein?), usando
autodie, open com 3 argumentos, muito bom mesmo! Agora, pra ficar
perfeito, falta só uma coisa: por favor, antes de mandar dúvidas,
lembre que as pessoas daqui da lista não estão sentadas aí do seu lado
olhando o seu problema, nem vivendo o seu dia-a-dia para saber os
motivos e objetivos do código, tampouco possuem (eu pelo menos não
possuo) poder de ler mente :-)

Por exemplo, quando vc pergunta algo do tipo:

 Monges, cade o erro???

Fica faltando o clássico grupo: o que vc está tentando fazer, de modo
geral? No código específico, o que deveria estar acontecendo mas não
está? Ainda no código específico, o que está de fato acontecendo em
vez do que deveria?

Quando, mesmo depois do Junior Moraes matar a charada, vc continua com:

 Mas me diz uma coisa, como editar um arquivo.

A gente tem que se esforçar até pra saber que é uma pergunta, mais
ainda qual é a real pergunta por trás da pergunta. Como editar um
arquivo é quase tão vago quanto Preciso saber o que estou errando
aqui (retirado de outra thread que vc começou). Percebe o padrão?

Isso não é uma bronca. Mas, pensa comigo: se der a impressão que vc
não está se esforçando nem pra fazer a pergunta, pq alguém se
esforçaria pra te dar a resposta? A atividade na lista é voluntária e
não remunerada, feita por pessoas com um interesse em comum (Perl) e
que se dispõem a ajudar umas às outras em seu tempo livre. Por isso
mesmo, se vc quer respostas melhores e mais rápidas, precisa nos
ajudar a te ajudar! Por exemplo, experimente ler suas perguntas em voz
alta antes de enviar o email, e veja se elas deixam realmente claro o
que você está perguntando. Existe um texto muito bom sobre isso
chamado Como fazer perguntas inteligentes mas também é grande e tem
muitas coisas lugar-comum que você certamente já sabe. Se me permite a
sugestão, vá direto nessas aqui, que são onde (eu pelo menos) sinto
mais dificuldade:

http://www.istf.com.br/perguntas/#writewell
http://www.istf.com.br/perguntas/#beprecise
http://www.istf.com.br/perguntas/#symptoms
http://www.istf.com.br/perguntas/#goal
http://www.istf.com.br/perguntas/#examples

Não estou falando isso pra vc ficar chateado, pelo contrário! Estou só
tentando te ajudar a nos ajudar, e assim tirar maior proveito das
listas e melhorar cada vez mais. Os parágrafos acima são uma leitura
super rápida, pense como um investimento: vc vai gastar menos de 5
minutos pra ler (e está traduzido em português!) e se prestar atenção
nesses pontos, tenho certeza que daqui pra frente você vai conseguir
respostas muito mais rapidamente nessa e em qualquer outra lista!

Dito isso, deixa eu tentar te ajudar. Eu *acho*, depois de perder um
bom tempo olhando pro seu exemplo, que a sua pergunta é:

Pessoal, como eu faço pra abrir o mesmo arquivo tanto para leitura
quanto para escrita?

ou

Pessoal, como eu faço para ler e escrever no mesmo arquivo, ao mesmo tempo?


Se for isso mesmo, é uma pergunta super comum. E, como a maioria das
coisas em Perl, há mais de uma maneira de se fazer :)

Digamos, para efeito de exemplo, que você queira passar o nome de um
arquivo como parâmetro para o seu programa. O arquivo tem o formato:

--8---
blablabla
ACTGAACAGTAGCTACTGACTCGTACGCTCGTAGC
lalalala
CAGCTGATCGATCGTAGCATGCTACG
--8---

E o que você quer é transformar esse arquivo em algo como:

--8---
contig0
ACTGAACAGTAGCTACTGACTCGTACGCTCGTAGC
contig1
CAGCTGATCGATCGTAGCATGCTACG
--8---

Claro, não só duas linhas e sim centenas, mas acho que deu pra entender.


Solução 1 (one-liner)


perl -i -pe 'BEGIN { $i = 0 } $i++ if s{^.+$}{contig$i}' arquivo.txt

Essa solução usa perl como ferramenta para transformação de arquivos
in place. O -pe executa o código entre aspas para cada linha do
arquivo passado, imprimindo o que estiver em $_ no final do
processamento de cada linha. O código em si é simples: substitua
^.+$ (início de linha seguido de  seguido de qualquer coisa,
seguido do fim da linha) pela string contig$i, onde $i é um número
que começa com zero (por isso o BEGIN { $i = 0 }, senão $i começa
vazio, e a primeira linha vira apenas contig em vez de contig0).
Sempre que conseguir fazer essa substituição (ou seja, sempre que a
linha em questão casar com a regex do lado esquerdo do s{}{}),
incremente o valor de $i. Assim, quando a linha casar com a regex, a
substituição sera feita, o $i será incrementado, e a linha será
impressa (por causa do -p). Se a linha não casar com a regex, nada
será feito e a linha será impressa sem mudanças (de novo, por causa do
-p).

Executando apenas com o -pe, ele vai imprimir na tela o resultado
pra vc. Isso significa que vc pode redirecionar pra outros arquivos,
se quiser. Mas como em nosso problema queremos que o próprio arquivo
seja