Empirius Tech Blog


perl Syntax Check

So einfach geht es, die Syntax eines perl-Skriptes oder sogar Moduls zu checken. Gezeigt anhand eines Beispiels.


perl Syntax Check

Man glaubt es kaum: perl hat einen eingebauten Syntax Checker!! Prinzipiell ist es sehr banal, ihn aufzurufen:

perl -c bla.pl

Aber es geht auch noch a bissl "hei sofisticateter", wie wir Bayern sagen:

  • Auch perl Module kann man damit checken
  • Abhängige Module werden ebenfalls geprüft
  • Man kann es sogar aus der IDE heraus aufrufen (sre weiß, wie das für den Notepad++ geht ...)
  • Beispiel

Aber mal langsam, gaaanz laaaangsaaaaam:

Perl Module checken

Ganz einfach:

perl -c some_module.pm

Problematik ist evtl. der Include-Pfad bzw. der "andere Include-Pfad". Hier muss man a bissl tricksen.

Abhängige Module prüfen

Letztlich kann man gar nicht anders! perl macht das IMMER. Bringt ja auch nix, wenn zwar der eigene Code ok ist, nicht aber die benutzten Module ...

Syntax-Check aus der IDE heraus

Mit der ActiveState IDE findet man es ganz einfach bei google, aber wer nutzt denn diese IDE???

Zum Notbett-PlusPlus soll sre gelegentlich mal ein paar Zeilen schreiben ...

Beispiel und Problematiken
S:\0repo\trunk>cd bin
 
S:\0repo\trunk\bin>perl -c ..\phases\user\notfree\Schweizer\FinishMaxDBSnap.pm
Can't locate BSC/Tools.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .
) at ..\phases\user\notfree\Schweizer\FinishMaxDBSnap.pm line 7.
BEGIN failed--compilation aborted at ..\phases\user\notfree\Schweizer\FinishMaxD
BSnap.pm line 7.

Da stehe ich also komplett im falschen Dir ... Besser:

S:\0repo\trunk\bin>cd ..

S:\0repo\trunk>perl -c phases\user\notfree\Schweizer\FinishMaxDBSnap.pm
Can't locate BSC/Tools.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .
) at phases\user\notfree\Schweizer\FinishMaxDBSnap.pm line 7.
BEGIN failed--compilation aborted at phases\user\notfree\Schweizer\FinishMaxDBSn
ap.pm line 7.

Auch ned wirklich bessa. Der Kunden UE liegt an einer Stelle, wo er normal nicht gefunden wird. Also kopieren/moven wir ihn an die richtige Stelle und schaun moi:

S:\0repo\trunk>perl -c phases\user\FinishMaxDBSnap.pm
Can't locate BSC/Tools.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .
) at phases\user\FinishMaxDBSnap.pm line 7.
BEGIN failed--compilation aborted at phases\user\FinishMaxDBSnap.pm line 7.

Schaugt doch scho WESENTLICH bessa aus :-) Da faid aba no wos. Die Include-Pfade, die normal im Hauptprogramm drin stehn.

S:\0repo\trunk>perl -Iblib -Ilib -c phases\user\FinishMaxDBSnap.pm
Passwordsafe directory 'S:/0repo/trunk/phases/etc' doesn't exist or isn't writab
le!
Compilation failed in require at blib/BSC/SSH2.pm line 13.
BEGIN failed--compilation aborted at blib/BSC/SSH2.pm line 13.
Compilation failed in require at blib/BSC/OS_Tools.pm line 42.

IMPORTANT: module BSC::SSH2 needs Net::SSH2 installed.
It is needed for Windows Server to Unix Hosts Communication!
See comments in OS_Tools.pm at lines 41ff

Compilation failed in require at phases\user\FinishMaxDBSnap.pm line 8.
BEGIN failed--compilation aborted at phases\user\FinishMaxDBSnap.pm line 8.

Oha! Sackl-Zement! Hob i vielleicht des SSH2-Modul ned installiert? Schaugn ma amoi:

S:\0repo\trunk>ppm

Na, des is scho installiert g'wen. Wenn ned, miass ma woanders schaugn, wia des gäht. Schaugn ma moi noch'm ersdn Fälla. Warum fint er bloß den g'sch... äh blädn Passwort Safe ned???

Ze'fix, nacha leng ma eam hoid des g'sch...eide Dir oafach hi:

S:\0repo\trunk>md S:\0repo\trunk\phases\etc

Nacha kemma eam nomoi los schicka:

S:\0repo\trunk>perl -Ilib -Iblib -c phases\user\FinishMaxDBSnap.pm
No passwordsafe file found - creating a new, user based on on first write action
!
phases\user\FinishMaxDBSnap.pm syntax OK

S:\0repo\trunk>

Saxndie! Des hod oafach so hi g'haut. Ja do legst di nieda! Des perl is hoid imma wieda a Hund!

 

Nachtrag:

Wie man an den (selber generierten) Fehlermeldungen der Beispiele sieht, muß man beachten: Jedes weitere eingebundene Skript (Module, Klassen, Packages...), ob nun per require oder per use wird nicht nur auf Syntax gecheckt, sondern auch entsprechend der Funktion von require/use ausgeführt. Man sollte also diese entweder vorher schon geprüft haben, oder nur Skripte einbinden, welche über keinen aktiven Code verfügen. Sprich: Welche nur subs im Bauch haben.

Auch Blöcke, welche schon zur Compile-Zeit zur Ausführung kommen, wie z.B. BEGIN-Blöcke, sind davon betroffen.


Tech Blog <- Zurück


Kommentare (1)

  1. Stefan Reddig:
    Sep 23, 2014 at 12:05 PM

    Ich nutze den Syntaxcheck in Notepad++ recht gern. Damit das auch komfortabel funktioniert, benutze ich das Plugin "NppExec" mit aktivierter Funktion "Follow $(CURRENT_DIRECTORY)".
    Mein Syntax-Check sieht folgendermaßen aus:

    env_set BSCBASE=C:\repo\bsc\branches\genjobtype
    echo Basis ist $(SYS.BSCBASE)
    cd $(CURRENT_DIRECTORY)
    perl -c -I$(SYS.BSCBASE)\lib -I $(SYS.BSCBASE)\blib $(FULL_CURRENT_PATH)


Kommentar hinzufügen:





Erlaubte Tags: <b><i><br>Kommentar hinzufügen: