Nano HE
Nano HE

Reputation: 9307

Global Variable, subroutine variable Question in Perl

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.

Upvotes: 5

Views: 32274

Answers (5)

burz
burz

Reputation: 21

The following code may demonstrate a solution to what you describe:

#!/usr/bin/perl
use strict;
my $var = "hello";
sub foo {
    local *var;
    print "$var world\n";
    $var = "hi";
}

sub bar {
    local *var;
    print "$var world\n";
    $var = "hey";
}

foo();
bar();
print "$var world\n";

The result should be:

hello world
hi world
hey world

Upvotes: 2

Snake Plissken
Snake Plissken

Reputation: 678

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.

Upvotes: 6

mirod
mirod

Reputation: 16151

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)

Upvotes: 15

MarcoS
MarcoS

Reputation: 13564

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.

Upvotes: 3

PP.
PP.

Reputation: 10864

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.

Upvotes: 2

Related Questions