Impressive work Bradley! I tested it and it worked great, even with my mandatory 'use strict'.

Thanks,

 - Darren


_____________________________

Darren Sessions
[EMAIL PROTECTED]
http://www.darrensessions.com
_____________________________





On Aug 29, 2008, at 5:47 AM, Watkins, Bradley wrote:


-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of
Darren Sessions
Sent: Thursday, August 28, 2008 10:12 PM
To: Asterisk Users Mailing List - Non-Commercial Discussion
Subject: [asterisk-users] Asterisk Tips and Tricks: Dynamic
Subroutines inAGI
...
The hurdle in doing something like this was how to
dynamically execute
a subroutine from the results of the database query which
were dumped
into a variable. The method I used with the subroutine reference
doesn’t allow for arguments to be passed (if anyone finds / knows a
way to do this, let me know), so I use global variables.

This is a simple example of dynamic subroutine execution
(without the
database query):

use strict;
use warnings;

our $called_number;
our $calling_number;

sub run_me {
  $AGI->verbose(”Called Number = “.$called_number, 1);
$AGI->verbose(”Calling Number = “.$calling_number, 1);
}

sub set_variables {
  $called_number = “8005551212″;
  $calling_number = “3002221111″;
}

sub dynamic_execute {
  my ($sub) = @_;
  if (!$sub) {
    $AGI->verbose(”No subroutine name passed!!”, 1);
    return(-1);
  }
  my $exec = \&{$sub};
  return($exec->());
}

set_variables();
dynamic_execute(”run_me”);

If you don't mind disabling strict refs (no strict 'refs';), you could easily do this.

This would allow you to use something like: &$sub($argument1, $argument2);

The only other way I can think of (though I have not tried it) would be to populate a hash with subroutine refs and use the string as the index into it.
Something like this:

#!/usr/bin/perl

use strict;
use warnings;
sub print_ref { print @_; };

my %sub_hash = ("print_ref", \&print_ref);

sub print_stuff {
       my $sub = shift;
       my $string = shift;
       &$sub($string);
}

print_stuff($sub_hash{"print_ref"}, "This is printed.\n");



The first idea uses the symbol table directly, and the second one essentially is building your own symbol table.

Hope that helps,
- Brad

_______________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

AstriCon 2008 - September 22 - 25 Phoenix, Arizona
Register Now: http://www.astricon.net

asterisk-users mailing list
To UNSUBSCRIBE or update options visit:
  http://lists.digium.com/mailman/listinfo/asterisk-users

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

AstriCon 2008 - September 22 - 25 Phoenix, Arizona
Register Now: http://www.astricon.net

asterisk-users mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-users

Reply via email to