views:

209

answers:

4

Hello.

How can I transfer the subroutine variable value into another subroutine variable, Can I use global variable.

sub foo(){

my $myvar = "Hello";
} 

sub foo1(){
my $myvar1 = $myvar;   # how can I get the "Hello" from $myvar.
}

I tried to use package and global variable, but failed.

Package Bar;
our $bar;

Thank you.

+1  A: 

You have a few approaches.

The simplest is not to declare the variable with my. But this requires you to avoid use strict; and not recommended as a result.

You could declare your variable outside the functions at the top of your script. This variable would then be available to all functions below. This is a consequence of scope: variables declares outside a set of curly braces are generally available inside any subsequent curly braces.

You could declare your variable using the use vars qw/$myvar/; pragma. This inherently makes your variable available throughout the following code.

PP
A: 

Just don't use my:

#!/usr/bin/perl

sub foo() {
  $myvar = "Hello\n";
}

sub foo1() {
  $myvar1 = $myvar;
    print $myvar1;
}

print "here we go!\n";
foo();
foo1();

However, I don't recommend this way of programming.

MarcoS
I'm a little unhappy with the downvoting applied to this question. A comment is enough to point out that the practice might have consequences. However one of the key sayings about Perl is "there is more than one way to do it" (TIMTOWTDI). To savage each other and say there is only one true way to do it is damaging to the Perl community. The author of this reply did so in good faith and perhaps instead of downvoting this post people could have upvoted the good posts instead. Downvoting is best for off-topic answers or deliberately inflammatory of which this post was neither.
PP
Could you please explain me why you are downvoting my answer above? Is it because of my comment on "this way of programming"?
MarcoS
The main issue I see with this (which no-one has chosen to mention, simply feeling that downvoting the answer or adding a cryptic getout with no justification will suffice) is that it uses implicit global variables. This is frowned upon (any global name can be used regardless of if it's declared => no compile-time detection of variable spelling errors, no scoping of variables => subtler bugs) and is one of the reasons why use strict/warnings is such a good idea.
ijw
+5  A: 

You could declare the variable in a scope that includes the 2 functions:

{ my $myvar

  sub foo{
    $myvar = "Hello";
  } 

  sub foo1{
    my $myvar1 = $myvar;   
  }
}

That is not really elegant though, and can be hard to maintain, as it is not clear in foo1 where the value of $myvar was set. It is probably better to pass the variable as an argument.

sub foo {
    my $myvar = "Hello";
    return $myvar;
}

sub foo1 {
  my( $myvar)= @_;
  my $myvar1 = $myvar;
}

# calling code
my $myvar= foo();
foo1( $myvar);

Note that all 3 $myvar are different variables, in different scopes.

As a side note, using prototypes (sub foo()) is probably not a good idea, unless you really know what they are doing, which is likely not to be the case ( see The problem with prototypes for a discussion on prototypes)

mirod
+3  A: 

How can I transfer the subroutine variable value into another subroutine variable, Can I use global variables?

Yes, you can:

my $myvar;
sub foo(){
    $myvar = "Hello";
} 

sub foo1(){
    my $myvar1 = $myvar;   # how can I get the "Hello" from $myvar.
}

This works even with "use strict;" and "use warnings;".

I tried to use package and global variable, but failed.

Package variables are for variables you want to export outside your package, not for variables you want to share between two subroutines in the same package.

Snake Plissken