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:

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":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.