Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??
I don't understand why the "use Carp qw(croak)" seemingly must be declared after the package, but the "use strict" doesn't

strict and warnings are lexically scoped pragmas. That means:

  • they are effect in the file or block in which they have been declared until the end of that file or block, even spanning packages
  • they are by themselves no package 1, but are included via use (and not via require), because their import() functions must be executed at compile time, since they contain compile time directives (but set bits for runtime context also)

OTOH, use Carp imports a package and defines its exported functions in the namespace which imports the package.

If you have imported a package once, you can refer to functions in that package from other packages also, but then those have to be fully qualified:

use strict; use warnings; use Carp qw(croak); package Test; sub croak_test { Carp::croak "this is a test"; } package main; Test::croak_test;

1) in the sense that they don't implement functions which are exported or methods callable via objects. - update: well, not quite. warnings actually has some usefull functions ;-)

update:

One way to make imported functions available to all packages in one file is storing those function's references in lexical scalars, and use those to call the functions:

use strict; use warnings; use Carp qw(croak); my $croak = \&croak; package Test; sub croak_test { $croak->("this is a test"); } package main; Test::croak_test;

Another way would be by assigning globs

package Test; *Test::croak = \&main::croak;
which essentially is what the import() function of an imported package does, for the symbols which are to import.

But if the set of functions is imported into the default package (which is main::), they can also be qualified with leading :: only from different packages:

# package main; is implicit here use strict; use warnings; use Carp qw(croak); package Test; sub croak_test { ::croak "this is a test"; } package main; Test::croak_test;

--shmem

_($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                              /\_¯/(q    /
----------------------------  \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}

In reply to Re: Use of Carp outside of package won't compile... by shmem
in thread Use of Carp outside of package won't compile... by memnoch

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (7)
As of 2024-04-23 20:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found