in reply to Re: "possible typo" warnings in modules
in thread "possible typo" warnings in modules

You are wrong. There is no separate check for "syntax errors" and later for "evaling." It sounds like your mental model of perl's internal workings are far off. Perl compiles into the same form, always. This form is directly executable. Code that is present at a module's file or "top" level is run just as soon as the file has finished being compiled.

I have the impression that you think perl is executing the statements by uh "evaling" them as source code at runtime kind of like bash or DOS batch files. That is far from the truth. The directly executable form I already mentioned is closer to being like an internal or hidden lisp. As perl reaches each instruction, it just follows a C function pointer to run each instruction. Every instruction returns the address of the next instruction in memory so the runloop does this very much like for ( $op = START; $op = $op->(); ){}.

⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

Replies are listed 'Best First'.
Re^3: "possible typo" warnings in modules
by zentara (Cardinal) on Feb 17, 2007 at 19:13 UTC
    Well how do you account for the behaviour that there are no errors when the syntax is correct, but an error when the syntax is wrong ( like a missing colon or scalars define twice with my)? Then if the syntax is ok, it lets it run and evaluation errors appear at runtime?

    UPDATE added example

    For instance this will stop at compile time:

    #!/usr/bin/perl use strict; use warnings; use lib '.'; use WarnMe; print "1\n"; print $WarnMe::val,"\n"; print "2\n";
    package WarnMe; use strict; use warnings; # syntax error my $val = $Some:Nonexistent::Pkg::variable; 1;
    outputs:
    zentara@:zentara$ ./WarnMe Global symbol "$Some" requires explicit package name at WarnMe.pm line + 7. syntax error at WarnMe.pm line 7, near "$Some:" Compilation failed in require at ./WarnMe line 5. BEGIN failed--compilation aborted at ./WarnMe line 5.

    Clearly the Perl compiler is checking syntax first. If you fix that syntax error, the script will compile and run with issuing a non-fatal runtime error:

    Name "WarnMe::val" used only once: possible typo at ./WarnMe line 8. 1 Use of uninitialized value in print at ./WarnMe line 8. 2

    I'm not really a human, but I play one on earth. Cogito ergo sum a bum

      Your first example throws all the proper errors. I don't know how to replicate your environment to get that to stop throwing warnings. Your second example also throws the proper warnings.

      ⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

        I agree they are both throwing proper warnings, but it's clear there is a difference in "compilation phase warnings" and "runtime warnings". The first example stops the compilation dead in it's tracks because of a syntax error. Wheras the programming error is allowed to pass as long as the syntax is correct.

        I think we are arguing over whether the Perl interpreter does a one pass or two pass scan of the code. I guess it only "appears" to do a syntax scan before it cancels the compilation, but I defer to your greater wisdom that it is actually a one pass operation. It seems to the end user that Perl is checking syntax first, and I see your point that it is a misunderstanding on my part, and the syntax scan is only an illusion.


        I'm not really a human, but I play one on earth. Cogito ergo sum a bum