Chap
Chap

Reputation: 3835

perl subroutine argument lists - "pass by alias"?

I just looked in disbelief at this sequence:

my $line;
$rc = getline($line); # read next line and store in $line

I had understood all along that Perl arguments were passed by value, so whenever I've needed to pass in a large structure, or pass in a variable to be updated, I've passed a ref.

Reading the fine print in perldoc, however, I've learned that @_ is composed of aliases to the variables mentioned in the argument list. After reading the next bit of data, getline() returns it with $_[0] = $data;, which stores $data directly into $line.

I do like this - it's like passing by reference in C++. However, I haven't found a way to assign a more meaningful name to $_[0]. Is there any?

Upvotes: 7

Views: 717

Answers (3)

Sundar R
Sundar R

Reputation: 14705

A version of @Steve's code that allows for multiple distinct arguments:

sub my_sub {
  SUB:
  for my $thisarg ( $_[0] ) {
    for my $thatarg ($_[1]) {
      code here sees $thisarg and $thatarg as aliases 
      last SUB;
    }
  }
}

Of course this brings multilevel nestings and its own code readability issues, so use it only when absolutely neccessary.

Upvotes: 0

Steve Sanbeg
Steve Sanbeg

Reputation: 887

The easiest way is probably just to use a loop, since loops alias their arguments to a name; i.e.

sub my_sub {
  for my $arg ( $_[0] ) {
    code here sees $arg as an alias for $_[0]
  }
}

Upvotes: 0

Joel Berger
Joel Berger

Reputation: 20280

You can, its not very pretty:

use strict;
use warnings;

sub inc {
  # manipulate the local symbol table 
  # to refer to the alias by $name
  our $name; local *name = \$_[0];

  # $name is an alias to first argument
  $name++;
}

my $x = 1;
inc($x);
print $x; # 2

Upvotes: 7

Related Questions