Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

Shift or return

by sandy1028 (Sexton)
on Apr 15, 2009 at 08:41 UTC ( [id://757591] : perlquestion . print w/replies, xml ) Need Help??

sandy1028 has asked for the wisdom of the Perl Monks concerning the following question:

This is a subroutine in package.
sub trun { my $string = shift or return ""; my $max = shift or return $string; .... }
From other .pl file arguments are passed. trun($string_file,$maximum); How the values are assigned to string_file and $maximum. Can you please tell me what is "shift or return """.

Replies are listed 'Best First'.
Re: Shift or return
by JavaFan (Canon) on Apr 15, 2009 at 08:56 UTC
    The sub returns the empty string if the first argument passed in to the module is false. (If no arguments are given, the empty string is returned as well).

    shift takes the first element of @_. or executes its right hand side argument only if the left hand side is false.

Re: Shift or return
by vinoth.ree (Monsignor) on Apr 15, 2009 at 09:02 UTC

    How the values are assigned to string_file and $maximum

    If the first shift success it assigns the @_'s first element to the $string variable, then the second shift assigns the second element to the $max variable, if the first shift fails it returns nothing.

Re: Shift or return
by dsheroh (Monsignor) on Apr 15, 2009 at 11:04 UTC
    Assigning to a variable returns as its result the value that was assigned. $foo = 3 returns 3, $bar = 'xyzzy' returns 'xyzzy', and so forth. $string = shift assigns $string the value of the first argument passed and returns that value, which is then evaluated by the or as either true or false. If the value is false (empty, undef, or 0), it then evaluates whatever comes after the or, in this case return "". If the value is true (any other value), then we already know that the expression is true (an or is true if either side is true), so it just continues on without evaluating the expression after the or. Evaluating only as much of a logical expression as is necessary to determine whether it's true or false is known as "short-circuit evaluation".


    • If there are no arguments or the first argument is false, there's nothing to truncate, so return an empty string.
    • If the second argument is missing or false, then we have no maximum length to truncate to, so return the original string without modification.
    Note, however, that there is a subtle bug in the first argument's handling: An empty string is returned if the first argument is false, not just if it's empty. This means that the string '0' (or '00' or '000' or...) will be incorrectly truncated to ''.

    Edit: Thanks to gwadej for correcting my incorrect impression that strings containing (only) multiple zeroes would evaluate as false.

      Remember the only false values in Perl are undef, 0, '', and '0'. The string values '00' and '000' are actually true.

      G. Wade
        Conversely, "false" is true, as are "lies", "damn lies", and "statistics".

        use JAPH;
        print JAPH::asString();

Re: Shift or return
by irah (Pilgrim) on Apr 15, 2009 at 08:59 UTC

    read about perlsub man page.