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