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}
-
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.