Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: Using import to generate subroutines

by tachyon (Chancellor)
on Nov 24, 2004 at 01:59 UTC ( #410037=note: print w/ replies, xml ) Need Help??


in reply to Using import to generate subroutines

Are you sure you just don't want to install an AUTOLOAD routine?

package Foo; bar(1,2,3); sub AUTOLOAD { my @args = @_; my ( $package, $func ) = split "::", $AUTOLOAD; print "ARGS: @args\nPKG: $package\nFUNC: $func\n"; }

cheers

tachyon


Comment on Re: Using import to generate subroutines
Download Code
Re^2: Using import to generate subroutines
by Thilosophy (Curate) on Nov 24, 2004 at 02:34 UTC
    > Are you sure you just don't want to install an AUTOLOAD routine?

    I was thinking about that. I ran into two problems, however.

    1) I still want to have things set themselves up with "use", so that the caller of my module does not have to mess with my modules internal functions (which he would have if he wanted to write an AUTOLOAD). So I was thinking to export an AUTOLOAD into the caller's namespace, but maybe that is evil.

    2) What I am really trying to do is make Oracle PL/SQL procedures appear like Perl procedures. PL/SQL procedures can have characters in them that are not allowed for Perl subroutines, most importantly a dot. If my Oracle function is called dbms_random.random, I can map that to a Perl function dbms_random_random, but that is a one-way mapping: An AUTOLOAD for dbms_random_random has no (easy) way to figure out if it is supposed to call dbms_random.random or dbms.random_random.

    Anyway, looking at AUTOLOAD was really worthwhile, makes one appreciate Perl even more.

      An AUTOLOAD for dbms_random_random has no (easy) way to figure out if it is supposed to call dbms_random.random or dbms.random_random.

      Well actually you have the same problem if you are exporting functions with the added disadvantage of tons of redundant code.

      sub AUTOLOAD { my ( undef, $funcname ) = split '::', $AUTOLOAD; my $mapping = { foo => 'foo.bar', bar => 'foobar', }; if ( exists $mapping->{$funcname} ) { # exec $mapping->{$funcname} } else { die "Can't do $funcname, NFI how to!\n"; } }

      cheers

      tachyon

        I said: An AUTOLOAD for dbms_random_random has no (easy) way to figure out if it is supposed to call dbms_random.random or dbms.random_random.

        You said: Well actually you have the same problem if you are exporting functions with the added disadvantage of tons of redundant code.

        I think I could get around the naming problem by explicitly exporting subroutines (and not using AUTOLOAD)

        use MyProcedures qw (dbms_random.random ); # this creates: sub CallingPackage::dbms_random_random { # call dbms_random.random in the database }

        So the subroutine you get has actually a different name than what you asked for, which admittedly is a bit strange.

        I do not get the part about the "tons of redundant code". The subroutines are only created when imported, and they are very slim (just one peppered subroutine call each).

        I put the module in my scratchpad if you want to have a look. Unless it turns out to be totally flawed I want to publish it to CPAN this week.

      PL/SQL procedures can have characters in them that are not allowed for Perl subroutines, most importantly a dot.
      Actually, this is wrong =]. To demonstrate:
      *{"dbms_random.random"} = sub { print "I am dbms_random.random\n" } "dbms_random.random"->();
      I have no idea what practical use this has, but I thought you should know!

      You might want to consider just exporting a hash of functions. That way all the functions are in one place for easy listing and so forth and you don't have to worry about mapping subroutine names, as hash keys can contain any character (which is why the subroutine definition code above works..)

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (8)
As of 2014-12-26 04:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (165 votes), past polls