Hoe controleer je of een Perl-script geen compilatiefouten bevat?

Ik roep veel Perl-scripts aan in mijn Bash-script (soms ook vanuit csh).

Aan het begin van het Bash-script wil ik een test plaatsen die controleert of alle Perl-scripts geen compilatiefouten bevatten.

Een manier om dit te doen zou zijn om het Perl-script daadwerkelijk aan te roepen vanuit het Bash-script en grepvoor “compilatiefout” in het doorgesluisde logbestand, maar dit wordt rommelig als verschillende Perl-scripts worden aangeroepen op verschillende punten in de code, dus ik wil dit helemaal aan het begin van het Bash-script doen.

Is er een manier om te controleren of het Perl-script geen compilatiefout bevat?


Antwoord 1, autoriteit 100%

Pas op!!

Het gebruik van de onderstaande opdracht om compilatiefouten in uw Perl-programma te controleren kan gevaarlijk zijn.

$ perl -c yourperlprogram

Randal heeft een heel mooi artikel over dit onderwerp geschreven dat je moet lezen

Citeer uit zijn artikel:

Waarschijnlijk is het eenvoudigste wat we kunnen zeggen “is het geldig?”. Voor deze,
we roepen perl zelf aan en passeren de alleen-compileren-schakelaar:

perl -c ourprogram

Voor deze bewerking compileert perl het programma,
maar stopt net voor de uitvoeringsfase. Dit betekent dat elke
een deel van de programmatekst wordt vertaald in de interne data
structuur die het werkprogramma vertegenwoordigt, maar dat hebben we eigenlijk niet
enige code uitgevoerd. Als er syntaxisfouten zijn, worden we geïnformeerd, en
de compilatie wordt afgebroken.

Eigenlijk is dat een beetje een leugen. Dankzij BEGIN-blokken (inclusief
hun gelaagde neef, de gebruiksrichtlijn), kan een Perl-code hebben:
zijn uitgevoerd tijdens deze theoretisch veilige “syntaxiscontrole”. Voor
als uw code bijvoorbeeld het volgende bevat:

BEGIN { warn "Hello, world!\n" } 

dan zie je dat bericht,
zelfs tijdens perl -c! Dit is enigszins verrassend voor mensen die:
beschouw “alleen compileren” als “voert geen code uit”. Houd rekening met de
code die bevat:

BEGIN { system "rm", "-rf", "/" } 

en je ziet het probleem met
dat betoog. Oeps.


Antwoord 2, autoriteit 8%

Behalve perl -c program.plis het ook beter om waarschuwingen te vinden met het commando:

perl -w program.pl

Zie voor details: http://www.perl.com/ pub/2004/08/09/commandline.html


Antwoord 3

Ik gebruik de volgende deelvan een bash-functie voor grotere perl-projecten:

# foreach perl app in the src/perl dir
 while read -r dir ; do
  echo -e "\n"
  echo "start compiling $dir ..." ;
  cd $product_instance_dir/src/perl/$dir ;
  # run the autoloader utility
    find . -name '*.pm' -exec perl -MAutoSplit -e 'autosplit($ARGV[0], $ARGV[1], 0, 1, 1)' {} \;
       # foreach perl file check the syntax by setting the correct INC dirs
     while read -r file ; do
        perl -MCarp::Always -I `pwd` -I `pwd`/lib -wc "$file"
        # run the perltidy inline
        # perltidy -b "$file"
        # sleep 3
        ret=$? ;
        test $ret -ne 0 && break 2 ;
     done < <(find "." -type f \( -name "*.pl" -or -name "*.pm" \))
     test $ret -ne 0 && break ;
     echo "stop compiling $dir ..." ;
     echo -e "\n\n"
     cd $product_instance_dir ;
 done < <(ls -1 "src/perl")

Antwoord 4

Wanneer u fouten / waarschuwingen moet controleren voordat u wordt uitgevoerd, maar uw bestand is afhankelijk van mutliple andere bestanden die u kunt toevoegen optie -I :

perl -I /path/to/dependency/lib -c /path/to/file/to/check

bewerken : van man Perlrun

Directories die zijn opgegeven door -i zijn voorbereid op het zoekpad voor modules (@inc).

Other episodes