ciao,
eccoti un esempio funzionante.
In realtà però dovessi mettere io il codice in produzione farei diversamente,
con soluzioni differenti anche a seconda della grandezza dei files che sto elaborando:
se il file pesasse pochi kb per esempio leggerei tutto il file in una volta ed
effettuerei le sostituzioni cercando di individuare un pattern riccorente;
se invece il file pesa molto, probabilmente leggerei da un file e simultaneamente
scriverei in un altro, in modo da svuotare sempre il buffer...
è comunque il bello del Perl: There's more than one way to do it (TIMTOWTDI:
http://en.wikipedia.org/wiki/There%2...e_way_to_do_it).
Ho voluto invece mantenere il tuo schema di lavoro, anche considerando che
si tratta di un esempio per imparare.
Ho ragionato così:
il simbolo "> nome" mi delimita l'inizio di una sequenza e la riga stessa
indica il nome dell'animale;
nelle righe successive non posso sapere se si tratta di una sequenza di
DNA finito o se ci sarà un'altra riga con un altro pezzo di DNA.
Devo quindi attendere che si ripresenti un simbolo "> nome":
solo allora posso stampare la sequenza precedente;
Procedo quindi così:
- ogni volta che si presenta ">nome":
stampo la sequenza precedente;
parte una nuova sequenza (aumento il contatore), le variabili contenenti dna e rna non
sono ancora inizializzate;
- ogni volta che c'è una sequenza di dna:
concateno una stringa.
Ecco qui:
codice:my $argc = $#ARGV + 1; if ($argc < 1) { print "usage: sequenza.txt"; print "\n\n"; exit 1 } #se non è verificata la condizione di prima e quindi il programma ha letto bene l'imput stampa OK else { print "OK\n"; } my $accFile = $ARGV[0]; my $a = 1; open(DNA, $accFile) or die("infile non trovato"); $num=0; $dna=undef; $rna=undef; while ($c = <DNA> ) { chomp($c); # elimino gli a capo if ( $c =~ /^>/ || eof(DNA) ){ #devo stampare la sequenza del dna anche quando è finito il file... if ( $num>0 ) { # la prima volta che si entra in questo ciclo, le variabili sono vuote: non c'è bisogno di stampare; # prova a togliere questo if e vedi che la prima sequenza sarà vuota; print "sequenza: $num\n"; print "DNA: $dna\n"; print "AFTER SUBSTITUTION:\n"; print "RNA: $rna\n"; print "\n"; } $dna=undef; #svuoto le variabili, non indispensabile... $rna=undef; $num++; } else { $dna.=$c; # concateno la sequenza di dna; $c =~ s/T/U/g; # sostituisco. In realta' potrei non memorizzare rna e effettuare la sotituzione direttamente nell'if. $rna.=$c; } }

Rispondi quotando