Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use Perl default array variable @_ with push?

Tags:

perl

In the perlvar documentation there is a text about @_:

Within a subroutine the array @_ contains the parameters passed to that subroutine. Inside a subroutine, @_ is the default array for the array operators push, pop, shift, and unshift.

It is a common way to use shift without parameters to get first element from the array. It is very often used as:

sub some_method {
    my $self = shift; # the same as `my $self = shift @_;`

    ...
}

But in the documentation there is written that it can be used with push, but I can't create working example without explicitly specifying @_ to the push. From reading this doc I'm expecting push 123; to push to @_, but it is not working.

like image 412
bessarabov Avatar asked Jun 21 '15 00:06

bessarabov


People also ask

How do I push an array array in Perl?

push (@myNames, @moreNames); Note for beginning programmers: Perl arrays begin with an @ symbol. Each complete line of code must end with a semicolon. If it doesn't, it won't execute.

How do you access an array element in Perl?

Perl Array Accessing To access a single element of a Perl array, use ($) sign before variable name. You can assume that $ sign represents singular value and @ sign represents plural values. Variable name will be followed by square brackets with index number inside it.

How do I get the last index of an array in Perl?

Perl provides a shorter syntax for accessing the last element of an array: negative indexing. Negative indices track the array from the end, so -1 refers to the last element, -2 the second to last element and so on.

How do I dereference an array in Perl?

Dereferencing an array It is done by placing the @ symbol (the sigil representing arrays) in-front of the reference. This can be written either wrapped in curly braces: @{$names_ref} or without the curly braces: @$names_ref.


1 Answers

I believe you've found an error in the documentation.

@_ is the default for pop and shift, but not for push and unshift. For both push and unshift, the array has to be specified explicitly.

perldoc -f push shows the syntax as:

push ARRAY,LIST
push EXPR,LIST

with no option to leave the array unspecified; likewise for perldoc -f unshift.

(The OP has submitted a Perl bug report; see https://gist.github.com/bessarabov/2e938f4bbb79e78d1941)

UPDATE:

This has been corrected. In the git repo for Perl, it was corrected in commit 256ca3d37ed232e10fbb2884be45691e745be7a9, 2015-06-21. The fix appears in releases 5.23.1 and 5.24.0. This doesn't seem to be mentioned in any of the perldelta*.pod files.

like image 181
Keith Thompson Avatar answered Oct 04 '22 17:10

Keith Thompson