Search code examples
perlshift

Perl shift operator simple question


What's the purpose of the following two lines of perl??

my $host = shift || 'localhost';
my $port = shift || 200;

That should return localhost and port 10. What is the shift keyword??


Solution

  • What this piece of code is, is a way to provide default values for $host and $port. It will typically be at the start of a script or a subroutine, and take values from @ARGV and @_ respectively.

    That should return localhost and port 10.

    No, the || operator is a short circuiting OR, which means that if the LHS operand returns a true value, the RHS operand is ignored. Basically, it means this (and ONLY this): "choose the left hand side value if it is true, otherwise choose the right hand side value."

    shift ARRAY will return the first value of ARRAY, or:

    If ARRAY is omitted, shifts the @_ array within the lexical scope of subroutines and formats, and the @ARGV array outside a subroutine and also within the lexical scopes established by the eval STRING , BEGIN {} , INIT {} , CHECK {} , UNITCHECK {} and END {} constructs.

    Quoted from http://perldoc.perl.org/functions/shift.html

    Also, of course, shift removes the value from the array that is shifted. Therefore you can have two shift in a row like this, for very convenient argument handling.