passing parameters

i've got a subrountine XYZ (in my library file)  which takes in 2 parameters and then call another subroutine (not in the library file, in another file) accordingly.

eg.  &XYZ("para1", "para2");

sub XYZ
  ($para1, $para2) = @_;

if (like this.....)

&$para1;   qn=> i know the code looks stupid, but how do i call the subroutine???
else { &$para2; }
Who is Participating?
b2piConnect With a Mentor Commented:
1.) $para1 and $para2 should be _references_ to functions, rather than the names of the functions.  Then you'd call

&XYZ(\&para1, \&para2);

2. ) If that's the case &$para1() or &$para2() should do the trick.

3.) if you insist on $para1 and $para2 being the names of the functions (really ugly, I mean, after all, we don't have to be stuck in perl4 forever), I suppose you could do


If it's in a different file, you may need to prepend the package:

eval("main::$para1()"); ## or whatever package it's in

Life get's hard if you need to pass parameters to the sub.  Really, use refs :)
Passing the name of the functions as seow is doing should work too.
Yeap, it should work (and I even handed off code to show how to do it).  On the other hand, I don't use labels and goto's in my perl code, even though it should work.  I don't use the map function, because I'm not a lisp programmer.

M \y point was that it was stylistically preferable, and much more maintainable, to use references.
Cloud Class® Course: Ruby Fundamentals

This course will introduce you to Ruby, as well as teach you about classes, methods, variables, data structures, loops, enumerable methods, and finishing touches.

I think ozo's point may have been that no eval or explicit reference is required, that the seow's original code actually works as is.

That is, that something like

$para1 = "para1";

works, calling sub para1.
Ummm, yeah, as long as you don't have use strict .

On the other hand, I thinnk whan my answer really shows is that I hand't had enough coffee.  Talk about bitchy... Some people's kids!
I prefer references stylisticly too.
I'd probably even prototype XYZ as taking code referneces,
call it withthout the &, and declare my($para1, $para2)
(I'd also indent differently, but that's more a matter of personal taste)
seowAuthor Commented:
thanx to all for the help.. now then i realize that my code really works.. (don know why it doesn't work b4) .. anyway..  just a few qns..

ozo: u mean i can just call my subroutine without the "&" ?? i don quite understand your last comment. Can pls elaborate more..

b2pi : thanx for your suggestions to use reference. i never thought of that and never even tried it b4.. (me still a novice) . Need to clarify something :
          on your suggested answer (the 1st one) , i don understand the point 2 part.
        u mean if i use reference, i must call my subroutine like &$para1() , with the brackets ?? can leave out the brackets..? does it matters that my "para1" is a subroutine ?

prototypes only work when you call a subroutine without using &
(which means it doesn't work calling a reference, whether strict or symbolic)
you can leave out the parentheses, see
perldoc perlsub
Try it a few different ways.  We'll try to clarify anything confusing.
If you pass references to routines, they you do have to call them as &$para.
You can also call them as &{$para}

You don't need the parentheses, nor do you need to identify the package they came from. In fact, you can do them anonymously....

 &XYZ(sub {
              print "This is the first sub\n";
          sub {
              print "This is the second sub\n"

sub XYZ  {
      ($sub1, $sub2) = @_;
    if (like this.....)  {
       &$sub1(parm1, parm2, parm3);
    } else {
       &$sub2(parm1, parm2, parm3);

Some object to anonymous sub's... some object to lambda's...
[hint: I'm not one of them.. .ignore the remark about lambda's, it's really close to flamebait! :))]

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.