Is there any difference between use Modulename;
and use Modulename();
?
Sometimes I see, for example, use Carp;
and sometimes use Carp ();
As documented,
use Modulename;
is the basically the same as
BEGIN {
require Modulename;
import Modulename;
}
while
use Modulename ();
is the basically the same as
BEGIN { require Modulename; }
That means the parens specify that you don't want to import anything. (It would also prevent a pragma from doing its work.)
Carp exports confess
, croak
and carp
by default, so
use Carp;
is short for
use Carp qw( confess croak carp );
By using
use Carp (); # or: use Carp qw( );
confess
, croak
and carp
won't be added to the caller's namespace. They will still be available through their fully qualified name.
use Carp ();
Carp::croak(...);
Without the ()
, the package's import
method will be called, possibly causing some default set of names to be exported into the calling package's namespace.
Passing the ()
explicitly says "Do not import any names into my namespace."
Most modern object-oriented modules don't export anything by default anyway, and there's nothing stopping them from manually polluting the caller's namespace if they wanted to, but specifying ()
is a signal that you're not relying on names magically appearing just because you imported a package.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With