Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Primi passi...Sostituzione T U

    Buongiorno ragazzi,
    sono nuovo nell'utilizzo del Perl e vorrei alcuni consigli.
    Ho creato un programmino che mi permette di sostituire le T con le U ma ho qualche problema.
    Naturalmente esisteranno gia degli script che fanno questa sostituzione ed anche in maniera piu semplice ma alla fine io l'ho fatto per esercitarmi e prendere un po la mano con il Perl.

    #!C:/perl/bin/perl.exe
    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");
    while ($c = <DNA>) {
    if ($c =~ /^>/){
    $c = "sequenza $a\n";
    $a++;
    print $c;
    }
    else
    {
    print "DNA: $c\n";
    ($c =~ s/T/U/g);
    $b = "AFTER SUBSTITUTION:\n RNA: $c\n";
    print $b;
    }
    }

    Il problema è che lo script ogni volta che nel file di input trova "l'accapo" la considera giustamente come una nuova stringa...non so come eliminare questa cosa..cioè:
    >cane
    ACCTATTATATATATCTCTCCTCTCT
    >gatto
    ACATATATTCCAGGA
    ACCCGGTTA

    Il risultato viene:
    >sequenza 1
    DNA: ACCTATTATATATATCTCTCCTCTCT
    AFTER SUBSTITUTION:
    RNA: ACCUAUUAUAUAUAUCUCUCCUCUCU

    >sequenza 2
    DNA: ACATATATTCCAGGA
    AFTER SUBSTITUTION:
    RNA: ACAUAUAUUCCAGGA

    DNA: ACCCGGTTA
    AFTER SUBSTITUITIO:
    RNA: ACCCGGUUA

    Naturalmente vorrei che "gatto" anche avendo gli accapo venisse considerata tutta la stessa stringa in modo da avere questo risultato
    >sequenza 2
    DNA: ACATATATTCCAGGAACCCGGTTA
    AFTER SUBSTITUTION:
    RNA: ACAUAUAUUCCAGGAACCCGGUUA

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non ho tempo ora per cercare nel manuale, e non ricordo lo switch necessario.
    In pratica oltre al /g alla fine della RE, devi aggiuingere un altra lettera (forse e` s ) che fa ignorare gli acapo.

    Se cerchi nel manuale perlre, lo dovresti trovare facilmente.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Grazie Mich ma già avevo provato ma non capisco perchè non mi funziona...ho provato con:

    ($c =~ s/T/U/gs);

    lasciando il resto tutto uguale ma purtroppo rimane tutto uguale?!

  4. #4
    ciao,
    lo script considera ogni volta l'a-capo come nuova stringa,
    perché è quello che gli stai dicendo di fare.

    Qui:
    codice:
    while ($c = <DNA> ) { ... }
    gli stai dicendo:
    leggi fino alla fine il file <DNA>,
    una riga per volta, finché non arrivi alla dine del file.

    Poi la sostituzione la fai qui, sulla singola riga:

    codice:
    ($c =~ s/T/U/g);
    sulla riga che hai assegnato alla variabile $c.

    Dunque secondo me te la cavi molto semplicemente mangiandoti (chomp) l'acapo
    nel caso si tratti della stringa del DNA.

    Il secondo problema è che ti stampa due volte le cose, proprio perché sei tu a stampargliele:
    per ogni riga che non comincia così > gli dici di fare questo:


    codice:
    print "DNA: $c\n";
    ($c =~ s/T/U/g);
    $b = "AFTER SUBSTITUTION:\n RNA: $c\n";
    print $b;
    quindi i motivi dell'errore sono abbastanza chiari.

    Adesso sono un po' di fretta.

    Appena ho un po' di tempo provo a ipotizzare una correzione
    (domani mattina credo).

    ciao

  5. #5
    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;
    
    	}
    
    }

  6. #6
    Grazie per la completezza della risposta...lunedi studio la risposta e ti faccio sapere

  7. #7
    ciao,

    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...
    Si si

    ho provato a fare copia e incolla del tuo codice per provarlo ma non funziona o meglio, funziona ma non riesco ad ottenere il risultato aspettato infatti il PC stampa

    >sequenza 1
    DNA: ACCTATTATATATATCTCTCCTCTCT
    AFTER SUBSTITUTION:
    RNA: ACCUAUUAUAUAUAUCUCUCCUCUCU

    >sequenza 2
    DNA: ACATATATTCCAGGA
    AFTER SUBSTITUTION:
    RNA: ACAUAUAUUCCAGGA

    non tenendo in considerazione la seconda parte della sequenza due
    ACCCGGTTA


    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?

    Grazie

  8. #8
    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)

  9. #9

    Tutto Ok...a questo punto secondo me servirebbe un ultimo controllo per vedere se le stringhe sono veramente DNA o meno cioè se la stringa non inizia con > o non ha al suo interno ACGT allora esce e dimmi errore. Ho provato in due modi ma senza nessun risultato purtroppo

    #controllo che sia veramente DNA
    if (( $c != /^>/ ) || ( $c != /[ACGT]/)) {
    print "errore";
    exit;
    }

    oppure

    #controllo che sia veramente DNA
    unless (( $c =~ /^>/ ) || ( $c =~ /[ACGT]/)) {
    print "errore";
    exit;
    }

    Il pc non mi da nessun errore ma non funziona come vorrei cioè se inserisco nella stringa che non inizia con > una qualsiasi lettera differente da ACGT per esempio F lui non la calcola e va avanti.
    Grazie

    P.S.
    Io ho studiato qua e la in internet i vari manuali, si sono fatti bene ma sono un po troppo "base" avete qualche link da suggerirmi? Naturalmente ho ordinato anche un libro in inglese per la bioinformatica..non faccio il nome perchè non credo si possa fare..

    AriGrazie

  10. #10
    Dimenticavo ho posizionato le istruzioni messe sopra dopo il chomp

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.