Wie ändere ich das in "idiomatische" Perl?

8

Ich fange an, tiefer in Perl zu gehen, aber ich habe Probleme, "Perl-ly" -Code zu schreiben, anstatt C in Perl zu schreiben. Wie kann ich den folgenden Code ändern, um mehr Perl-Idiome zu verwenden, und wie soll ich die Idiome lernen?

Nur eine Erklärung dessen, was es tut: Diese Routine ist Teil eines Moduls, das DNA- oder Aminosäuresequenzen ausrichtet (mit Needelman-Wunch, wenn Sie sich für solche Dinge interessieren). Es erstellt zwei 2D-Arrays, eines für die Speicherung einer Punktzahl für jede Position in den beiden Sequenzen und eines für die Verfolgung des Pfads, damit die Ausrichtung mit der höchsten Punktzahl später erneut erstellt werden kann. Es funktioniert gut, aber ich weiß, dass ich die Dinge nicht sehr klar und deutlich mache.

edit: Dies war für eine Aufgabe. Ich habe es abgeschlossen, möchte aber meinen Code etwas aufräumen. Die Details zur Implementierung des Algorithmus finden Sie auf der Klassen-Website , falls Sie interessiert sind.

%Vor%     
jergason 23.10.2009, 16:22
quelle

6 Antworten

7

Ich habe noch einige andere Kommentare, aber hier ist die erste Beobachtung:

%Vor%

So $self->{seq1} und $self->{seq2} sind Zeichenketten und Sie greifen weiterhin auf einzelne Elemente mit substr zu. Ich würde es vorziehen, sie als Arrays von Zeichen zu speichern:

%Vor%

So hätte ich es geschrieben:

%Vor%     
Sinan Ünür 23.10.2009, 16:33
quelle
9

Sie erhalten mehrere Vorschläge bezüglich der Syntax, aber ich würde auch einen modulareren Ansatz vorschlagen, wenn aus irgendeinem anderen Grund die Lesbarkeit des Codes. Es ist viel einfacher, Code auf den neuesten Stand zu bringen, wenn Sie das große Bild wahrnehmen können, bevor Sie sich über Details auf niedriger Ebene Gedanken machen.

Ihre primäre Methode könnte so aussehen.

%Vor%

Und Sie hätten auch mehrere kleinere Methoden wie folgt:

%Vor%

Und Sie könnten sogar noch weiter gehen, indem Sie noch kleinere Methoden definieren - Getter, Setter und so weiter. Zu diesem Zeitpunkt würden Ihre Methoden der mittleren Ebene wie create_2d_array_of_scores die zugrunde liegende Datenstruktur nicht direkt berühren.

%Vor%     
FMc 23.10.2009 17:27
quelle
8

Eine einfache Änderung besteht darin, for Schleifen wie folgt zu verwenden:

%Vor%

Weitere Informationen finden Sie in der Perl-Dokumentation zu foreach-Schleifen und der Bereichsoperator .

    
FMc 23.10.2009 16:32
quelle
7

Anstatt die zweidimensionalen Arrays wie folgt zu dereferenzieren:

%Vor%

tu dies:

%Vor%

Sie tun auch eine Menge von if / then / else-Anweisungen, die mit bestimmten Untersequenzen übereinstimmen: Dies könnte besser als given -Anweisungen geschrieben werden (entspricht perl5.10s C's switch ). Lesen Sie dazu perldoc perlsyn :

%Vor%     
Ether 23.10.2009 16:36
quelle
5

Der Großteil Ihres Codes bearbeitet 2D-Arrays. Ich denke, die größte Verbesserung wäre die Umstellung auf die Verwendung von PDL , wenn Sie viel mit Arrays arbeiten möchten, insbesondere wenn es um Effizienz geht. Es ist ein Perl-Modul, das eine ausgezeichnete Array-Unterstützung bietet. Die zugrunde liegenden Routinen sind in C für Effizienz implementiert, so dass es auch schnell ist.

    
ire_and_curses 23.10.2009 16:34
quelle
0

Ich rate immer zu CPAN für frühere Lösungen oder Beispiele, wie man Dinge in Perl macht. Haben Sie sich Algorithmus :: NeedlemanWunsch angesehen?

Die Dokumentation zu diesem Modul enthält ein Beispiel für die Zuordnung von DNA-Sequenzen. Hier ist ein Beispiel mit der Ähnlichkeitsmatrix von Wikipedia .

%Vor%

Und hier ist eine Beispielausgabe:

%Vor%     
heferav 25.10.2009 11:32
quelle

Tags und Links