Abbruchbedingung für while schleife

Hallo,
ich habe ein Skript geschrieben das mir für jedes motif (Reihenfolge von Nukleotiden) die exakten Positionen in der Sequenz ausgibt. Allerdings lande ich in einer Endlosschleife und bräuchte eine Abbruchbedingung für den Fall das das Motif in der Restsequenz nicht ehr gefunden wird. Hat da einer eine Idee?

#!/usr/bin/perl -w
use strict;
use Bio::stuck_out_tongue:erl;

This script will find the exact location of motifs in a DNA sequence

my $dnafilename;
my $varfilename;
my $refseq;
my $pos;
my $motif;
my $refseqtemp;
my @dna;
my $dna;
my @var;
my $var;
@var=();
@dna=();

print "Enter the filename of your input file with the sequence:= "; # File that contains your DNA sequence
chomp ($dnafilename=);
open(DNAINPUT,’);
open (VARINPUT,’; # stores the sequence in an array

print @dna;

while ()
{ # stores the variants in an array
chomp;
push @var, $_;
}

$refseq= $dna[0];
chomp $refseq;
$pos=0; # position of the first base

foreach my $thing (@var)
{
$motif=$thing;
$refseqtemp = $refseq; #für jedes Motiv wieder mit der ganzen Sequenz starten
print „$motif\n“;
$motif =~ s/^\w*\s//;
print „$motif\n“;
while(length($refseq)>0) # as long as there is a rest sequence (>0)
{
my $length = length($refseq);
print „length now $length\n“;
if ($refseq=~ /($motif)/ig) # search for the motif (variant)
{
print „found\n“;
$pos= $pos + length($’)-1;
print „pos $pos\n“;
$pos= $pos + length($&amp:wink:;
$refseq= $’;
$dna=$dna+1;
}
}
if ($dna==0)
{
print „Sorry, no match\n“;
}

}
}
}

LG,
Anja

MOD: prehtml-tags um den Code herum eingefügt

Hallo,

also zuerst solltest du den Code konsistent einrücken, damit er besser lesbar ist. Siehe z.B. http://perldoc.perl.org/perlstyle.html

while(length($refseq)>0) # as long as there is a rest
sequence (>0)
{
my $length = length($refseq);
print „length now $length\n“;
if ($refseq=~ /($motif)/ig) # search for the motif
(variant)
{
print „found\n“;
$pos= $pos + length($’)-1;
print „pos $pos\n“;
$pos= $pos + length($&amp:wink:;
$refseq= $’;
$dna=$dna+1;
}
}

Das hier scheint das Problem zu sein.
Wenn du nach allen matches einer Regex suchst, gibt es in Perl eine einfachere Möglichkeit:

while ($refseq =~ /($motif)/ig) {
 print "found\n";
 $dna++;
}

Solltest du die Position des Matches brauchen, kannst du darauf mit pos($refseq) zugreifen.

Grüße,
Moritz