Hello masood91, and welcome to the Monastery!
In Perl, arguments are passed into subroutines by reference (as opposed to a language like C, in which arguments are passed by value). The special variable @_ contains aliases to the arguments passed in, so you can use them directly:
sub abc { $_[0] = 42; }
but that changes the variables outside of the subroutine. For example, if the above were called as follows:
my $x = 17; abc($x);
then after the subroutine call $x would contain 42. Since this is usually not what you want, it is standard practice to simulate pass-by-value by copying the arguments as the first statement in the subroutine:
sub abc { my ($x, $y, $z) = @_; }
or (less commonly):
sub abc { my @args = @_; }
(Note that @_ is an array variable.) To remove the first element from an array and get its value, Perl provides shift:
my $num = shift @array;
After this operation the first element in @array has been removed and stored in the scalar variable $num. Now, within a subroutine, if shift is used without an argument then it automatically applies to @_. Hence, another common idiom is:
sub abc { my $x = shift; my $y = shift; my $z = shift; }
which does the same as:
sub abc { my ($x, $y, $z) = @_; }
except that with shift the elements are also removed from the @_ array.
Hope that helps,
| Athanasius <°(((>< contra mundum | Iustus alius egestas vitae, eros Piratica, |
In reply to Re: difficulty in understanding use of @_ and shift in a subroutine
by Athanasius
in thread difficulty in understanding use of @_ and shift in a subroutine
by masood91
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |