hai ragione! è una mia svista!
Siccome l'ultima riga è anche quella della chiusura del file,
non entrerà mai nell'else concatenando le stringhe di gatto.
In pratica la fine del file (eof) dovrebbe svolgere due compiti:
stampare il risultato e concatenere le stringhe.
Essendo stati da me messi in alternativa (if ... else) non verranno mai
eseguiti entrambi i compiti.
E' opportuno modificare un po' il codice:
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
/*** assegno le variabili ***/
unless ( $c =~ /^>/ ) { # ogni volta che la riga non comincia con > concateno
$dna.=$c; # concateno la sequenza di dna;
$c =~ s/T/U/g; # sostituisco. In realta' potrei non memorizzare rna effettuare la sostituzione direttamente nell'if.
$rna.=$c;
}
/**** sequenza di stampa ***/
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++;
}
}
Comunque delle tue correzioni non riesco a capire fino in fondo il significato dell'estruzione || eof(DNA)
e della concatenazione della sequenza di DNA e RNA...dovrebbe servire a concatenare le sequenze se si va a capo?
In pratica ho diviso il codice in due fasi che prima erano alternative (Vedi l'errore dell'if... else di cui sopra) e ora invece sono indipendenti.
La concatenazione è appunto per evitare l'a-capo:
soltanto quando hai l'intera sequenza del DNA (che magari è su piu' righe) puoi operare,
quindi hai bisogno di leggere una riga, concatenere, leggere l'altra riga, concatenere se necessario, oppure stampare.
Per quel che riguarda la stampa siccome tutto quello che non è "> nome" è DNA,
l'unico modo per capire quando è finita una sequenza di DNA è la presenza di una stringa "> nome".
Così quando sono in presenza di "> nome", stampo la sequenza precedente. Con due eccezioni:
1. la prima volta che compare ">nome", non c'è nessuna sequenza precedente
(potresti anche scrivere:
codice:
next if ($num==0);
), quindi si va avanti;
2. quando sei alla fine del file NON esisterà nessuna sequenza successiva, quindi la sequenza precedente
alla fine del file va stampata: ecco perché