Solved

passing parameters

Posted on 1998-07-30
9
155 Views
Last Modified: 2010-03-04
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; }
0
Comment
Question by:seow
9 Comments
 
LVL 5

Accepted Solution

by:
b2pi earned 20 total points
Comment Utility
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

eval("$para1()");

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 :)
0
 
LVL 84

Expert Comment

by:ozo
Comment Utility
Passing the name of the functions as seow is doing should work too.
0
 
LVL 5

Expert Comment

by:b2pi
Comment Utility
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.
0
 
LVL 6

Expert Comment

by:alamo
Comment Utility
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";
&$para1;

works, calling sub para1.
0
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
LVL 5

Expert Comment

by:b2pi
Comment Utility
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!
0
 
LVL 84

Expert Comment

by:ozo
Comment Utility
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)
0
 

Author Comment

by:seow
Comment Utility
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 ?

0
 
LVL 84

Expert Comment

by:ozo
Comment Utility
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.
0
 
LVL 5

Expert Comment

by:b2pi
Comment Utility
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! :))]

0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
stftime format 4 51
rename outfile before writing 2 66
Using Perl DBI to query oracle 3 30
quoting a comma separated list 20 63
On Microsoft Windows, if  when you click or type the name of a .pl file, you get an error "is not recognized as an internal or external command, operable program or batch file", then this means you do not have the .pl file extension associated with …
I have been pestered over the years to produce and distribute regular data extracts, and often the request have explicitly requested the data be emailed as an Excel attachement; specifically Excel, as it appears: CSV files confuse (no Red or Green h…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now