Ich habe gerade mit der Programmierung in Perl begonnen und möchte nur herausfinden, ob der unten stehende Code effizienter oder in weniger Zeilen erstellt werden kann.
Ich habe ein bisschen in das Win32::OLE
Modul und die Text::CSV
Modul, aber dies schien der Weg zu gehen von dem, was ich bisher gelesen habe.
Diese Frage ist im Prinzip ein Neuling, der einen Ältesten fragt: "Hey, wie werde ich ein besserer Perl-Programmierer?"
Der Zweck des Codes besteht darin, Daten aus bestimmten Bereichen in bestimmten Blättern einer Excel-Arbeitsmappe abzurufen und den Inhalt dieser Bereiche in CSV-Dateien zu schreiben.
Ich weiß auch, dass ich allgemeine Prüfungen implementieren muss, wie zum Beispiel dafür, dass my $cellValue
definiert ist, bevor ich es zum Array hinzufüge und so weiter, aber ich suche mehr nach der Gesamtstruktur. Wie gibt es eine Möglichkeit, das Schleifen zu verflachen, indem man die ganze Reihe in ein Array auf einmal oder den gesamten Bereich in ein Array oder eine Referenz oder etwas dieser Art einfügt?
Danke
%Vor% Marks Vorschlag ist ausgezeichnet. Eine weitere kleine Verbesserung wäre das Ersetzen von "Mach ein Bündel verschachtelter Logik if $cell
, mit" tue nichts unless $cell
- auf diese Weise hast du etwas mehr lesbaren Code (entferne 1 zusätzliche Einrückung / verschachtelten Block; UND nicht muss sich sorgen, was passiert, wenn $ cell leer ist.
Wie Sie bereits angemerkt haben, wäre Text::CSV
eine gute Sache, je nachdem, ob Ihre Daten jemals basierend auf dem CSV-Standard zitiert werden müssen (z. B. Leerzeichen, Kommas, Anführungszeichen usw.). Wenn es notiert werden muss, erfinden Sie das Rad nicht neu und verwenden stattdessen Text::CSV
zum Drucken. Ein nicht getestetes Beispiel wäre etwa so:
Kein Grund, diese innere Schleife zu haben:
%Vor% Stellen Sie außerdem sicher, dass Ihre Indizes korrekt sind. Ich bin nicht vertraut mit Spreadsheet :: XLSX, also stellen Sie sicher, dass max col & amp; Die Zeilen sind nullbasiert wie der Rest Ihres Codes. Wenn dies nicht der Fall ist, sollten Sie über 0 .. $maxCol-1
iterieren.
Ich würde von harten Coding-Dateinamen abraten ... besonders in kleinen Projekten wie diesem, gewöhnt euch die Dateinamen über GetOpt::Long
zu übergeben. Wenn Sie das bei all Ihren kleinen Projekten tun, macht es viel leichter, sich daran zu erinnern, es richtig zu machen, wenn es auf ein größeres Projekt ankommt.
Ihr Code ist gut strukturiert und lesbar, und Sie haben die Probleme mit Ihren Schleifenanweisungen vorweggenommen, Sie haben Warnungen und strikte verwendet, und Sie verwenden Bibliotheken in der Regel richtig.
Wie andere schon gesagt haben, ist Ihr Code klar und gut strukturiert. Aber ich denke, dass es mit etwas mehr Perlness verbessert werden könnte.
Die folgenden Punkte kommen mir in den Sinn
Verwenden Sie lexikalische Dateihandles und die Drei-Parameter-Form von open
( open my $newfile, '>', $myFile
)
Iterate über Hash- oder Array-Werte (oder Slices von ihnen) und nicht über ihre Schlüssel oder Indizes, außer Sie benötigen wirklich die Schlüssel für den Schleifenkörper
Extrahieren Sie Zeiger auf Datenunterstrukturen innerhalb einer Schleife, wenn dies der Fokus der Schleife ist ( my $rows = $worksheet->{Cells}
)
Spot, wo Sie eine Schleife verwenden, um eine Liste in eine andere umzuwandeln, und stattdessen map
verwenden
Ich hoffe, ich bin nicht ein bisschen gesprungen, indem ich eine Lösung mit Text::CSV
geschrieben habe, wie Sie vorgeschlagen haben. Mit etwas Glück ist das für dich lehrreich.
Tags und Links perl