Thread syntax error über mehrere Zeilen trotz Semikolon (8 answers)
Opened by bioinformatics at 2012-09-26 17:06

betterworld
 2012-09-28 10:46
#162131 #162131
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Guest bioinformatics
Code: (dl )
1
2
3
4
5
6
7
8
9
        for (keys %$hashref) {

$query = $_;

$hashref->{$query}->[$idxMax] > $hashref->{$query}->[$_] or $idxMax = $_ for 1 .. @$#hashref->{$query}; #finds the index of the biggest array element

print "Hello World\n";

}

Der Code wirkt etwas unheimlich, weil $query und $idxMax nirgends deklariert werden. Vielleicht solltest Du noch einmal Wiki:UseStrict lesen, auch den Abschnitt "Wo sollten Variablen deklariert werden?".

Die Variable $idxMax wird daher auch immer noch den Wert vom letzten Durchlauf der äußeren for-Schleife haben. Sie wird nur erhöht, wenn ein noch größerer Index gefunden wird. Eventuell ist das gewollt. Da ein "}" am Ende fehlt, nehme ich mal an, dass die äußere for-Schleife noch mehr Code enthält, der hier ausgelassen wurde. (So etwas sollte man in Foren vermeiden -- lieber Code posten, der auch direkt von den anderen ausgeführt werden kann.)

Jedenfalls kann man das alles viel einfacher schreiben. Zumindest so:
Code: (dl )
1
2
3
4
for my $arrayref (values %$hashref) {
$arrayref->[$idxMax] > $arrayref->[$_] or $idxMax = $_ for 1 .. $#arrayref; #finds the index of the biggest array element
print "Hello World\n";
}


Hierbei sieht man auch, dass es sich lohnt, Hilfsvariablen zu benutzen, die eine Referenz auf einen Teil der ganzen Datenstruktur sind. So vermeidet man, dass so viele Sonderzeichen auf einen Haufen gebraucht werden. Den Namen $arrayref habe ich hier nur gewählt, weil ich nicht weiß, welche Bedeutung dieses Array hat. Besser wäre natürlich ein Name, der den Sinn verdeutlicht.

Wenn man die Indices nicht explizit braucht, muss man sie in Perl oft gar nicht direkt benutzen. So kann man auch die ersten Zeile umschreiben:
Code: (dl )
1
2
for my $row (@blat_data) {
my @splitted_row = split /\t/, $row;

View full thread syntax error über mehrere Zeilen trotz Semikolon