develooper Front page | perl.beginners | Postings from June 2009

Re: Request for code feedback

Thread Previous | Thread Next
From:
Chas. Owens
Date:
June 13, 2009 08:55
Subject:
Re: Request for code feedback
Message ID:
58ce48dc0906130855g6a7ee8b8sff414b9e4993f545@mail.gmail.com
On Sat, Jun 13, 2009 at 07:30, John W. Krahn<jwkrahn@shaw.ca> wrote:
> Chas. Owens wrote:
>>
>> On Sat, Jun 13, 2009 at 03:48, John W. Krahn<jwkrahn@shaw.ca> wrote:
>>>
>>> Chas. Owens wrote:
>>>>
>>>> On Fri, Jun 12, 2009 at 20:24, Steve Bertrand<steve@ibctech.ca> wrote:
>>>>>
>>>>> my $hours_used   = ($hours_lookup->get_month_hours($dbh, $username,
>>>>> $search_date, 'dialup'));
>>>>
>>>> Why are you creating a list here?  Just say
>>>
>>> Do you mean the list ($dbh, $username, $search_date, 'dialup')?  I think
>>> that is required for the function to work correctly.  Otherwise there is
>>> no
>>> other list there, the external parentheses are superfluous and do not
>>> define
>>> a list.  A scalar rvalue enclosed in parentheses is just a scalar value.
>>
>> No, it is a list of one item,
>
> perldoc perlfunc
> [ snip ]
>    Remember the following important rule: There is no rule that relates
>    the behavior of an expression in list context to its behavior in
>    scalar context, or vice versa.  It might do two totally different
>    things.  Each operator and function decides which sort of value it
>    would be most appropriate to return in scalar context.  Some
>    operators return the length of the list that would have been
>    returned in list context.  Some operators return the first value in
>    the list.  Some operators return the last value in the list.  Some
>    operators return a count of successful operations.  In general, they
>    do what you want, unless you want consistency.
>
>    A named array in scalar context is quite different from what would
>                                                            ^^^^^^^^^^
>    at first glance appear to be a list in scalar context.  You can’t
>    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^
>    get a list like "(1,2,3)" into being in scalar context, because the
>    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>    compiler knows the context at compile time.  It would generate the
>    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>    scalar comma operator there, not the list construction version of
>    the comma.  That means it was never a list to start with.
>                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> perldoc perlfaq4
> [ snip ]
> Data: Arrays
>    What is the difference between a list and an array?
>
>    An array has a changeable length.  A list does not.  An array is
>    something you can push or pop, while a list is a set of values.
>    Some people make the distinction that a list is a value while an
>    array is a variable.  Subroutines are passed and return lists, you
>    put things into list context, you initialize arrays with lists, and
>    you foreach() across a list.  "@" variables are arrays, anonymous
>    arrays are arrays, arrays in scalar context behave like the number
>    of elements in them, subroutines access their arguments through the
>    array @_, and push/pop/shift only work on arrays.
>
>    As a side note, there’s no such thing as a list in scalar context.
>                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>    When you say
>
>        $scalar = (2, 5, 7, 9);
>
>    you’re using the comma operator in scalar context, so it uses the
>    scalar comma operator.  There never was a list there at all!  This
>                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>    causes the last value to be returned: 9.
>
>
>> which in scalar context yields the last
>
> There is no such thing as a list in scalar context (see above.)
>
>> item (which also happens to be the only item) just like any other
>> list.  You are correct that they are superfluous, that is why I am
>> asking him why he is bothering to create the list with them.
>
> Parentheses do not create a list, they are used to define precedence.
>
>
>> If the parentheses did not create a list then this code
>>
>> my $undef = ();
>>
>> Would produce an error because there is no scalar value to assign to
>> $undef.  Instead, () is a list of no items which yields an undef in
>> scalar context.  There is nothing magical about
>
> There is no such thing as a list in scalar context (see above.)
>
>
>> my $scalar = (1);
>>
>> that makes (1) not a list but a scalar instead, it follows the exact
>> same rules as all other lists: yield your last element in scalar
>> context.  This is roughly the same as
>
> There is no such thing as a list in scalar context (see above.)
>
>
>> my $s = @a[0];
>>
>> It works, but is probably not what you meant to say.
>
>
>
>
> John
> --
> Those people who think they know everything are a great
> annoyance to those of us who do.        -- Isaac Asimov
>
>
> --
> To unsubscribe, e-mail: beginners-unsubscribe@perl.org
> For additional commands, e-mail: beginners-help@perl.org
> http://learn.perl.org/
>
>
>

Alright, I concede my understand was flawed.

-- 
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About