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é
codice:
|| eof(DNA)