Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^3: How to import names from a dynamically required module

by tobyink (Abbot)
on Oct 03, 2012 at 06:35 UTC ( #996990=note: print w/ replies, xml ) Need Help??


in reply to Re^2: How to import names from a dynamically required module
in thread How to import names from a dynamically required module

This is not specific to import; it works with all class method calls...

use Math::BigInt; my $class = "Math::BigInt"; my $six = $class->new(6); my $seven = "Math::BigInt"->new(7); my $eight = join("::", "Math", "BigInt")->new(8);

In fact, string quoting class names is arguably a much better idea than the more conventional Math::BigInt->new(9), because the latter will start behaving surprisingly if there's ever a BigInt sub defined in the Math package.

perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'


Comment on Re^3: How to import names from a dynamically required module
Select or Download Code
Re^4: How to import names from a dynamically required module
by choroba (Abbot) on Oct 03, 2012 at 08:05 UTC
    string quoting class names is arguably a much better idea
    Or, you can use Math::BigInt::->new(8).
    لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

      Or you can use Math::BigInt->new, because the odds of there being a BigInt sub in the Math package are astronomical :)

        The odds are small, yes. In my decade plus of Perl usage I've encountered bugs because of this two, perhaps three, times. But each time it took me bloody ages to figure out, which is why I have been trying to avoid this ambiguity in recent work.

        The aliased module is, by the way, an excellent way of avoiding these problems:

        use aliased 'Math::BigInt'; my $seven = BigInt->new(7); # no ambiguity
        perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

      Indeed. This has the (often welcome) side-effect that the existence of the package is checked at compile-time, and a warning is issued (if warnings are enabled) if the package does not exist.

      With stringy class names (and indeed with the traditional Foo::Bar->new) there is no such check, and Perl just blows up when it can't resolve the method call.

      perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://996990]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (15)
As of 2014-08-27 19:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (250 votes), past polls