PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : array und subroutine



anou
21-09-2010, 21:06
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

reneeb
30-09-2010, 11:39
Schauen wir uns mal an, was Du bisher hast...



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 close(INPUT); solltest Du rausnehmen.



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 $txtfile??

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.



while(<INPUT>)
{


Es ist kein Filehandle mit dem Namen "INPUT" offen. Hier solltest Du eine Fehlermeldung bekommen.



#print $_;
@temp=(@temp,$_);

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


my @lines = <INPUT>;

schreiben.




}
while(<@temp>)
{


Was willst Du mit dieser Schleife erreichen??




#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?



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


[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


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:


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

anou
03-10-2010, 16:14
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