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 grep
voor “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
- Sanity-controle van uw Perl-code( Linux Magazine Column 91, maart 2007)
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.pl
is 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).