web-dev-qa-db-fra.com

Comment vérifier si un script Perl ne contient aucune erreur de compilation?

J'appelle beaucoup de scripts Perl dans mon script Bash (parfois aussi à partir de csh).

Au début du script Bash, je veux mettre un test qui vérifie si tous les scripts Perl sont exempts d’erreurs de compilation.

Une façon de procéder consiste à appeler le script Perl à partir du script Bash et à grep pour "erreur de compilation" dans le fichier journal acheminé, mais cela devient compliqué à mesure que différents scripts Perl sont appelés à différents points du code. faire cela au tout début du script Bash.

Existe-t-il un moyen de vérifier si le script Perl n'a pas d'erreur de compilation?

44
user13107

Il faut se méfier!!

L'utilisation de la commande ci-dessous pour vérifier les erreurs de compilation dans votre programme Perl peut être dangereuse.

$ Perl -c yourperlprogram

Randal a écrit un très bel article sur ce sujet que vous devriez consulter.

Citant son article: 

La chose la plus simple que nous puissions dire est probablement "est-ce que c'est valide?". Pour ça, nous invoquons Perl lui-même en passant le commutateur Compile-Only:

Perl -c ourprogram

Pour cette opération, Perl compile le programme, mais s'arrête juste avant la phase d'exécution. Cela signifie que chaque une partie du texte du programme est traduite dans les données internes structure qui représente le programme de travail, mais nous n'avons pas réellement exécuté n'importe quel code. S'il y a des erreurs de syntaxe, nous en sommes informés et la compilation avorte.

En fait, c'est un peu un mensonge. Grâce aux blocs BEGIN (y compris Leur cousin superposé, la directive use), certains codes Perl peuvent avoir été exécuté au cours de cette "vérification de syntaxe" théoriquement sûre. Pour exemple, si votre code contient:

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

alors vous verrez ce message, même pendant Perl -c! C'est un peu surprenant pour les gens qui considérez "compiler uniquement" comme "n'exécute aucun code". Prendre en compte code qui contient:

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

et vous verrez le problème avec cet argument. Oops.

64
Chankey Pathak

Outre Perl -c program.pl, il est également préférable de rechercher les avertissements à l'aide de la commande:

Perl -w program.pl

Pour plus de détails, voir: http://www.Perl.com/pub/2004/08/09/commandline.html

4
Bharat Jain

J'utilise le partie suivant d'une fonction bash pour les projets Perl plus importants: 

 # 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")
0
Yordan Georgiev