Anzeige:
Ergebnis 1 bis 3 von 3

Thema: array und subroutine

  1. #1
    Registrierter Benutzer
    Registriert seit
    03.08.2010
    Beiträge
    29

    array und subroutine

    Hi,

    ich hab ein array mit einem Motiv (regulärer Ausdruck) in verschiedenen Varianten. Jetzt würde ich gern das array mit meinem script einlesen und mithilfe der subroutine die Positionen der einzelnen Varianten in der Sequenz bestimmen. Allerdings weiß ich nicht wie ich das array mit dem script verbinden kann. Kann mir da vielleicht jemand weiterhelfen?
    Hier ist der codeden ich bis jetzt habe:

    print "Please type the filename of your input file:= ";
    chomp ($dnafilename=<STDIN>);
    open(INPUT,'<',$dnafilename) or die ("$dnafilename Can not open file\n");
    close(INPUT);

    print "Please type in the name of your txt file:= ";
    chomp (@array=<STDIN>);
    open (INPUT,"<$txtfile") or die ("$txtfile Can not open file\n");
    close(INPUT);

    while(<INPUT>)
    {
    #print $_;
    @temp=(@temp,$_);
    }
    while(<@temp>)
    {
    #print $_;
    @temp=(@temp,$_);
    }

    do{
    print "What is the motif you are searching for?\n" ;
    $motif=<STDIN>;
    $temp=0;
    chomp $motif;

    if (exists $txtfile{$motif})
    {
    ($recognition_site, $regexp)=split(" ", $motif);
    @locations=match_positions($regexp);

    if(@locations)
    {
    print "Searching for $motif $recognition_site $regexp\n";
    print "Motif $motif has been found at locations:\n";
    }
    else
    {
    print "Motif $motif has not been found:\n";
    }
    }
    print "\n";
    }
    until ($motif=~/quit/);
    exit;



    ###################
    #Subroutine
    #Find locations of a motif in a string
    #return an array of positon where the motif appears in the string

    sub match_position
    {
    my($motif, $_)=@_;
    use strict;

    my @positions=();

    while(<@temp>)
    {
    if($_=~ /$motif/ig)
    {
    push (@positions, pos($_) -length($&)+1);
    }
    }
    return @positions;
    }

    LG,
    Anja

  2. #2
    Registrierter Benutzer
    Registriert seit
    05.02.2006
    Beiträge
    116
    Schauen wir uns mal an, was Du bisher hast...

    Code:
    print "Please type the filename of your input file:= ";
    chomp ($dnafilename=<STDIN>);
    open(INPUT,'<',$dnafilename) or die ("$dnafilename Can not open file\n");
    close(INPUT);
    Du öffnest die Datei und schließt sie gleich wieder. Das [tt]close(INPUT);[/tt] solltest Du rausnehmen.

    Code:
    print "Please type in the name of your txt file:= ";
    chomp (@array=<STDIN>);
    open (INPUT,"<$txtfile") or die ("$txtfile Can not open file\n");
    close(INPUT);
    Woher kommt [tt]$txtfile[/tt]??

    Du solltest Dir auch mal dringend http://wiki.perl-community.de/Wissensbasis/UseStrict anschauen.

    Und Du benutzt zum zweiten Mal "INPUT" als Namen für einen Filehandle. Das solltest Du nicht machen.

    Code:
    while(<INPUT>)
    {
    Es ist kein Filehandle mit dem Namen "INPUT" offen. Hier solltest Du eine Fehlermeldung bekommen.

    Code:
    #print $_;
    @temp=(@temp,$_);
    So etwas schreibt man besser als [tt]push @temp, $_;[/code]. Aber wenn Du alle Zeilen der Datei in einem Array haben möchtest, kannst DU auch statt der while-Schleife einfach

    Code:
    my @lines = <INPUT>;
    schreiben.


    Code:
    }
    while(<@temp>)
    {
    Was willst Du mit dieser Schleife erreichen??


    Code:
    #print $_;
    @temp=(@temp,$_);
    }
    
    do{
    print "What is the motif you are searching for?\n" ;
    $motif=<STDIN>;
    $temp=0;
    chomp $motif;
    
    if (exists $txtfile{$motif})
    Hier arbeitest Du auf einmal mit einem Hash. Wo kommt der her?

    Code:
    {
    ($recognition_site, $regexp)=split(" ", $motif);
    @locations=match_positions($regexp);
    Woher kommt [tt]$regexp[/tt]??

    [code]
    while(<@temp>)
    {
    if($_=~ /$motif/ig)
    {
    push (@positions, pos($_) -length($&)+1);
    }
    }
    Mit <...> liest Du von einem Filehandle! Wenn die Zeilen einer Datei in @temp stecken und Du nach $motif in diesen Zeilen suchen willst, musst Du Du

    Code:
    for my $zeile ( @temp ) { ... }
    benutzen.

    $& zu verwenden ist nicht gut, weil damit alle Regulären Ausdrück relativ langsam werden. Den if-Teil würde ich so schreiben:

    Code:
    if( my ($treffer) = $_ =~ /($motif)/ig) # bzw. $zeile statt $_
    {
    push  @positions, pos($_) - length($treffer)+1;
    }

  3. #3
    Registrierter Benutzer
    Registriert seit
    03.08.2010
    Beiträge
    29
    Hallo,
    vielen Dank erstmal für deine Antwort, hab sie gerade erst gesehen

    Und Du benutzt zum zweiten Mal "INPUT" als Namen für einen Filehandle. Das solltest Du nicht machen.

    Zitat:
    Code:

    while(<INPUT>)
    {

    Es ist kein Filehandle mit dem Namen "INPUT" offen. Hier solltest Du eine Fehlermeldung bekommen.
    bekomme ich nicht, und mir wurde gesagt sobald ich eine Datei eingelesen habe kann ich sie wieder schließen...

    if (exists $txtfile{$motif})

    Hier arbeitest Du auf einmal mit einem Hash. Wo kommt der her?
    eientlich wollte ich mit array arbeiten, hab den aber nicht eingebunden bekommen

    Ansonsten habe ich den Code soweit verändert wie du es gesagt hast. Danke

    Anja

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •