in reply to Using constants...

perldoc -f use as of 5.10.0/5.10.1 gives this hint in the section on use constant; use strict; et al:

Some of these pseudo-modules import semantics into the current block scope (like "strict" or "integer", unlike ordinary modules, which import symbols into the current package (which are effective through the end of the file).

which misled me into stopping to think way too early: whatever this documentation scrap might refer to, it's not the applicable here -> see my question in Re^3 below.

cu & sorry, Peter -- hint was wrong, be careful of contagious confusion.

Replies are listed 'Best First'.
Re^2: Using constants...
by ikegami (Patriarch) on Oct 29, 2009 at 18:03 UTC

    Actually, constant is like an ordinary module. It exports functions, it doesn't change semantics, and the effects are tied to the package and not the caller's scope.

      ikegami's right as a BEGIN{require 'constants.pl'} (thanx!) or even a simple peek at %main:: does show.

      But I'm still wondering about this section in perldoc -f use:

      Because this is a wide-open interface, pragmas (compiler directives) are also implemented this way. Currently implemented pragmas are:
            use constant;
            use diagnostics;
            use integer;
            use sigtrap  qw(SEGV BUS);
            use strict   qw(subs vars refs);
            use subs     qw(afunc blurfl);
            use warnings qw(all);
            use sort     qw(stable _quicksort _mergesort);
      
      Some of these pseudo-modules import semantics into the current block scope (like "strict" or "integer", unlike ordinary modules, which import symbols into the current package (which are effective through the end of the file).

      Let me attempt to make sense of it:

      Now a BEGIN{require "constants.pl"} basically turns contents.pl into a module. Add a do "y" somewhere near the end in main.pl. Create this file y and have it just print STDERR keys %main::. Copy it to a file z and prepend BEGIN{do "main.pl"}. Run perl -e ./z. Wonder. Check Exporter documentation and do a similar little test with imported symbols. And start WONDERING.

      • use strict; obviously is well behaved and doesn't mess with other files or blocks outside its enclosing lexical scope. Ok. Should the same for stuff like integer et al.
      • Function definitions in %main:: are valid beyond the end of the file.
      • If file A requires a file B, which in turn says 'use ... qw/function/;', the function by default is visible also in the file A. Using Exporter doesn't localize things, and the imported functions and symbols are also visible in files other than the file containing the actual use statement (read: way beyond end of enclosing file).

      I'm now fully confused, and it's not the missing parens in the quoted section above:

      • What does the above quote from perldoc -f use try to say?
      • What exactly might effective through the end of file refer to? Especially given the the mention of ordinary modules!?
      • What kind of (importing symbols in package name space from?) ordinary modules has file scope!?

      Any ideas on what is actually meant?

      cu & thanx, Peter -- --INT due to confusion spell.

        What does the above quote from perldoc -f use try to say?

        Some modules are pragmas. pragams affect the behaviour of code scope in which they are used rather than provide subs.

        What kind of ordinary modules has file scope!?

        Since you're using "ordinary" to mean not like a pragma, none do by definition.

        What exactly might effective through the end of file refer to?

        It equates end of file with end of the package, and thus to the end of the visibility of the imported functions.