#!/usr/bin/perl use strict; use warnings; sub callback_reply { print "callback_reply got " . scalar @_ . " args: @_\n\n"; } my ( %callback_sub, %callback_wrapper ); for my $i ( 1 .. 4 ) { my $subname = "function_$i"; $callback_sub{$subname} = sub { print "args passed to $subname: @_\n"; my $err_value = ( rand > 0.5 ) ? 1 : 0; my $rtn_value; $rtn_value += $_ for ( @_ ); return ( $err_value, $rtn_value ); }; $callback_wrapper{$subname} = sub { my ( $cb_id, @params ) = @_; my ( $_err, $cb_data ) = $callback_sub{$subname}->( @params ); callback_reply( $cb_id, $_err, $cb_data ); return $_err; } } for my $i ( 1 .. 4 ) { my @parms; for my $j ( 0 .. 1 + int( rand( 4 ))) { push @parms, sprintf( "%5.3f", $i + rand ); } printf( "Calling wrapper %d with %d params: %s\n", $i, scalar @parms + 1, "$i @parms" ); $callback_wrapper{"function_$i"}->( $i, @parms ); }