Le code Perl est compilé avant d'être exécuté, mais pas pour le code machine. C'est un peu comme comment Java est compilé en code octet, mais le résultat est de plus haut niveau.
# B::Concise shows the opcode tree that results from compiling Perl code
$ perl -MO=Concise,-exec -e'print("Hello, world!\n") for 1..3;'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark s
4 <$> const[IV 1] s
5 <$> const[IV 3] s
6 <#> gv[*_] s
7 <{> enteriter(next->b last->e redo->8) lKS/8
c <0> iter s
d <|> and(other->8) vK/1
8 <0> pushmark s
9 <$> const[PV "Hello, world!\n"] s
a <@> print vK
b <0> unstack v
goto c
e <2> leaveloop vK/2
f <@> leave[1 ref] vKP/REFC
-e syntax OK
Lorsque Perl est demandé d'exécuter un fichier (car il a été passé à perl
, require
, do EXPR
ou eval EXPR
), il commence par Compile le fichier entier, exécute alors le code compilé juste.
Si use
ou BEGIN
se produit pendant la phase de compilation, l'instruction use
ou BEGIN
bloc est exécuté dès qu'il a terminé la compilation.
# -c causes the main program to be compiled but not executed.
$ perl -c -E'
say "abc";
BEGIN { say "def"; }
say "ghi";
'
def
-e syntax OK
$ perl -E'
say "abc";
BEGIN { say "def"; }
say "ghi";
'
def
abc
ghi
Certaines erreurs peuvent être détectées lors de la compilation.
$ perl -c -E'say "abc" "def";'
String found where operator expected at -e line 1, near ""abc" "def""
(Missing operator before "def"?)
syntax error at -e line 1, near ""abc" "def""
-e had compilation errors.
D'autres ne le peuvent pas.
$ perl -c -E'$x={}; $x->[0]'
-e syntax OK
$ perl -E'$x={}; $x->[0]'
Not an ARRAY reference at -e line 1.
Un grand nombre d'erreurs 'use strict;' et 'use warnings; 'sont réellement détectées au moment de l'exécution. (par exemple '$ x =" abc "; $ x -> {def}' et 'print undef;') – ikegami