in reply to Use of Carp outside of package won't compile...
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
which essentially is what the import() function of an imported package does, for the symbols which are to import.package Test; *Test::croak = \&main::croak;
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}
|
|---|