Re: Assigning anonymous hash to a list

2013-08-01 Thread David Cantrell
On Wed, Jul 31, 2013 at 10:44:23PM -0300, Hernan Lopes wrote:

> if you dont understood what i meant, i am not going to explain.

I normally find that if someone can't get another to understand what
they mean, then they don't really understand it themselves.

-- 
David Cantrell | A machine for turning tea into grumpiness

Seven o'clock in the morning is something that
happens to those less fortunate than me


Re: Assigning anonymous hash to a list

2013-08-01 Thread Tom Hukins
On Wed, Jul 31, 2013 at 10:44:23PM -0300, Hernan Lopes wrote:
> if you dont understood what i meant, i am not going to explain.

Please keep pointless, unhelpful messages like this off our mailing
list.

Tom (London.pm leader)


Re: Assigning anonymous hash to a list

2013-08-01 Thread Paul Johnson
On Wed, Jul 31, 2013 at 10:44:23PM -0300, Hernan Lopes wrote:
> if you dont understood what i meant, i am not going to explain.

I understood, and I'm happy to explain.

> On 7/31/13, Peter Corlett  wrote:
> > On Wed, Jul 31, 2013 at 01:04:11PM -0300, Hernan Lopes top-posted:
> >> it should be the same size to do what he wants... otherwise it wont work.

This is a special case of "it should do what he wants, otherwise it
won't work" which (granted, outside of IT) is generally considered a
truism.


PS Of the three commas I wrote in the paragraphs above, one is in scalar
context, one is in list context, and one is just a comma.

Of the three commas in the previous paragraph, one is Oxford.


[ Please imagine that I have added sufficient smileys, emoticons, emoji,
pictures of cats and ponies, etc. that your day is no worse for having
wasted your time reading this message. ]

-- 
Paul Johnson - p...@pjcj.net
http://www.pjcj.net


Re: Assigning anonymous hash to a list

2013-07-31 Thread Hernan Lopes
if you dont understood what i meant, i am not going to explain.


On 7/31/13, Peter Corlett  wrote:
> On Wed, Jul 31, 2013 at 01:04:11PM -0300, Hernan Lopes top-posted:
>> it should be the same size to do what he wants... otherwise it wont work.
>
> Why "should"? Perl doesn't require the LHS of an array assignment have the
> same
> number of elements as the RHS, and there are a number of use cases where
> you
> may not want it.
>
>


Re: Assigning anonymous hash to a list

2013-07-31 Thread Paul Makepeace
On Wed, Jul 31, 2013 at 10:37 AM, Peter Corlett  wrote:

> On Wed, Jul 31, 2013 at 01:04:11PM -0300, Hernan Lopes top-posted:
> > it should be the same size to do what he wants... otherwise it wont work.
>
> Why "should"? Perl doesn't require the LHS of an array assignment have the
> same
> number of elements as the RHS, and there are a number of use cases where
> you
> may not want it.
>

Indeed. E.g.,

my ($arg1, $arg2, $..., @...) = @_;  # is covered early on in a perl
neophyte's training

Paul


Re: Assigning anonymous hash to a list

2013-07-31 Thread Peter Corlett
On Wed, Jul 31, 2013 at 01:04:11PM -0300, Hernan Lopes top-posted:
> it should be the same size to do what he wants... otherwise it wont work.

Why "should"? Perl doesn't require the LHS of an array assignment have the same
number of elements as the RHS, and there are a number of use cases where you
may not want it.



Re: Assigning anonymous hash to a list

2013-07-31 Thread Hernan Lopes
it should be the same size to do what he wants... otherwise it wont work.


On 7/31/13, Abigail  wrote:
> On Tue, Jul 30, 2013 at 11:36:12PM -0300, Hernan Lopes wrote:
>> sorry i meant 1 thing on the left and one thing on the right. Both are
>> lists and should be the same size.
>
>
> Since when? Both:
>
> my ($a, $b) = (1);
>
> and
>
> my ($a, $b) = (1, 2, 3);
>
> are fine.
>
>> On 7/30/13, Hernan Lopes  wrote:
>> > When you do that, you are implicitly saying:
>> >
>> > The thing on the left is equals the thing in the right.
>> > So, in the left you have 1 thing ( a list because of parenthesis ),
>> > and on the right, you have 2 things: string+object.
>> >
>> > Add parenthesis on the right and transform it into a list.
>
> As said before, adding parenthesis to the RHS of the assignment doesn't
> turn that into a list. The RHS is already a list, due to the fact it's
> in list context, which in turn is caused by the list of the LHS.
>
> Adding parenthesis to the RHS tells Perl to parse things differently:
> the comma is not the top level operator, but a lower level operator.
> In fact, the parenthesis on the RHS aren't any more magical than the
> parenthesis here:
>
> 3 * (4 + 5);
>
> which is parsed differently compared to:
>
> 3 * 4 + 5;
>
>
>
> Abigail
>


Re: Assigning anonymous hash to a list

2013-07-31 Thread LeoNerd
On Tue, 30 Jul 2013 20:23:40 +0100
Hakim Cassimally  wrote:

> As it happens, Perl *can* do destructuring bind.  You want parentheses
> around the list though:

Incidentally, that's not a destructuring bind, it's just a
list-assignment. A full destructuring bind is recursive; it would allow
things like

  my [ $a, $b, { foo => $c, bar => $d } ] =
 [ "some", "values", { bar => "here", foo => "are" } ];

-- 
Paul "LeoNerd" Evans

leon...@leonerd.org.uk
ICQ# 4135350   |  Registered Linux# 179460
http://www.leonerd.org.uk/


signature.asc
Description: PGP signature


Re: Assigning anonymous hash to a list

2013-07-31 Thread Abigail
On Tue, Jul 30, 2013 at 11:36:12PM -0300, Hernan Lopes wrote:
> sorry i meant 1 thing on the left and one thing on the right. Both are
> lists and should be the same size.


Since when? Both:

my ($a, $b) = (1);

and

my ($a, $b) = (1, 2, 3);

are fine.

> On 7/30/13, Hernan Lopes  wrote:
> > When you do that, you are implicitly saying:
> >
> > The thing on the left is equals the thing in the right.
> > So, in the left you have 1 thing ( a list because of parenthesis ),
> > and on the right, you have 2 things: string+object.
> >
> > Add parenthesis on the right and transform it into a list.

As said before, adding parenthesis to the RHS of the assignment doesn't
turn that into a list. The RHS is already a list, due to the fact it's
in list context, which in turn is caused by the list of the LHS.

Adding parenthesis to the RHS tells Perl to parse things differently:
the comma is not the top level operator, but a lower level operator.
In fact, the parenthesis on the RHS aren't any more magical than the
parenthesis here:

3 * (4 + 5);

which is parsed differently compared to:

3 * 4 + 5;



Abigail


Re: Assigning anonymous hash to a list

2013-07-30 Thread Joseph Werner
Careful,  the hounds are loose tonight!

On Tue, Jul 30, 2013 at 10:36 PM, Hernan Lopes  wrote:
> sorry i meant 1 thing on the left and one thing on the right. Both are
> lists and should be the same size.
>
> On 7/30/13, Hernan Lopes  wrote:
>> When you do that, you are implicitly saying:
>>
>> The thing on the left is equals the thing in the right.
>> So, in the left you have 1 thing ( a list because of parenthesis ),
>> and on the right, you have 2 things: string+object.
>>
>> Add parenthesis on the right and transform it into a list.
>>
>> After that perl will understand you are assinging the first thing on
>> the list (from left) equals the first thing on the list (from right)
>> and so on.
>>
>> []'s
>>
>> Hernan Lopes
>>
>> On 7/30/13, gvim  wrote:
>>> Can anyone explain why this works:
>>>
>>> my $ref = {a => 1,  b => 2, c => 3};
>>> say $ref->{b}; #  Result: 2
>>>
>>> ... but this doesn't :
>>>
>>> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
>>> say $ref->{b};   # Result: Use of uninitialized value
>>>
>>> Seems a little inconsistent.
>>>
>>> gvim
>>>
>>



-- 
Best Regards,
[Joseph] Christian Werner Sr
C 360.920.7183
H 757.304.0502
Txt 757.304.0502


Re: Assigning anonymous hash to a list

2013-07-30 Thread Hernan Lopes
sorry i meant 1 thing on the left and one thing on the right. Both are
lists and should be the same size.

On 7/30/13, Hernan Lopes  wrote:
> When you do that, you are implicitly saying:
>
> The thing on the left is equals the thing in the right.
> So, in the left you have 1 thing ( a list because of parenthesis ),
> and on the right, you have 2 things: string+object.
>
> Add parenthesis on the right and transform it into a list.
>
> After that perl will understand you are assinging the first thing on
> the list (from left) equals the first thing on the list (from right)
> and so on.
>
> []'s
>
> Hernan Lopes
>
> On 7/30/13, gvim  wrote:
>> Can anyone explain why this works:
>>
>> my $ref = {a => 1,  b => 2, c => 3};
>> say $ref->{b}; #  Result: 2
>>
>> ... but this doesn't :
>>
>> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
>> say $ref->{b};   # Result: Use of uninitialized value
>>
>> Seems a little inconsistent.
>>
>> gvim
>>
>


Re: Assigning anonymous hash to a list

2013-07-30 Thread Hernan Lopes
ie:

my ( $first_thing_on_the_left, $second_thing ) = ( "first something" ,
{ second => 'something' } );

On 7/30/13, Hernan Lopes  wrote:
> When you do that, you are implicitly saying:
>
> The thing on the left is equals the thing in the right.
> So, in the left you have 1 thing ( a list because of parenthesis ),
> and on the right, you have 2 things: string+object.
>
> Add parenthesis on the right and transform it into a list.
>
> After that perl will understand you are assinging the first thing on
> the list (from left) equals the first thing on the list (from right)
> and so on.
>
> []'s
>
> Hernan Lopes
>
> On 7/30/13, gvim  wrote:
>> Can anyone explain why this works:
>>
>> my $ref = {a => 1,  b => 2, c => 3};
>> say $ref->{b}; #  Result: 2
>>
>> ... but this doesn't :
>>
>> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
>> say $ref->{b};   # Result: Use of uninitialized value
>>
>> Seems a little inconsistent.
>>
>> gvim
>>
>


Re: Assigning anonymous hash to a list

2013-07-30 Thread Hernan Lopes
When you do that, you are implicitly saying:

The thing on the left is equals the thing in the right.
So, in the left you have 1 thing ( a list because of parenthesis ),
and on the right, you have 2 things: string+object.

Add parenthesis on the right and transform it into a list.

After that perl will understand you are assinging the first thing on
the list (from left) equals the first thing on the list (from right)
and so on.

[]'s

Hernan Lopes

On 7/30/13, gvim  wrote:
> Can anyone explain why this works:
>
> my $ref = {a => 1,  b => 2, c => 3};
> say $ref->{b}; #  Result: 2
>
> ... but this doesn't :
>
> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
> say $ref->{b};   # Result: Use of uninitialized value
>
> Seems a little inconsistent.
>
> gvim
>


Re: Assigning anonymous hash to a list

2013-07-30 Thread Uri Guttman

On 07/30/2013 06:52 PM, Joseph Werner wrote:

Hmmm.  Yitzchak Scott-Thoennes, I recognize, Abigail I do not (perhaps
I should?)

So, Yitzchak, is this, in fact, a simple matter of operator precedence
in that the ',' operator is of lower precedence than the assignment
operator (absurd though that may seem)  AND not a case of a scalar
value (which is the result of a Perl expression involving a ','
operator) being offered to a  list assignment?


perldoc perlop shows the comma op has very low precedence. it allows for 
this:


$foo = 1, $bar = 2 ;

that does what you think it does, 2 assignments. the example in question 
breaks into 2 expressions connected by a comma (assignment in perl is 
still just an expression). the left expression does the assignment and 
the right expression has nowhere to go (hence its void context). as 
others (abigail too) have shown, warnings will catch useless data in 
void context.


so parens around the right side changes where the comma binds to just 
inside the parens. now it assigns that list to the LHS list. note that 
the comma is now a list separator and not the scalar comma op.


so this is absolutely a precedence issue and nothing else. the key is 
that assignment binds tighter than the comma. your eyes may say 
otherwise but perl (and abigail) knows better! :)


thanx,

uri


--
Uri Guttman - The Perl Hunter
The Best Perl Jobs, The Best Perl Hackers
http://PerlHunter.com


Re: Assigning anonymous hash to a list

2013-07-30 Thread Yitzchak Scott-Thoennes
On Tue, Jul 30, 2013 at 4:12 PM, Yitzchak Scott-Thoennes
 wrote:
> Yes, as was demonstrated clearly by someone with Deparse and someone
> else by enabling warnings (sorry, forget who).

Both Abigail :)


Re: Assigning anonymous hash to a list

2013-07-30 Thread Joseph Werner
> You can believe anything Abigail says.

Hmmm.. . respect is an earned thing; You, Yitzchak, have earned my
respect for reasons that transcend mere accuracy.

Thank you for the day's lesson,

-- 
Best Regards,
[Joseph] Christian Werner Sr
C 360.920.7183
H 757.304.0502
Txt 757.304.0502


Re: Assigning anonymous hash to a list

2013-07-30 Thread Abigail
On Tue, Jul 30, 2013 at 06:52:32PM -0400, Joseph Werner wrote:
> Hmmm.  Yitzchak Scott-Thoennes, I recognize, Abigail I do not (perhaps
> I should?)
> 
> So, Yitzchak, is this, in fact, a simple matter of operator precedence
> in that the ',' operator is of lower precedence than the assignment
> operator (absurd though that may seem)  AND not a case of a scalar
> value (which is the result of a Perl expression involving a ','
> operator) being offered to a  list assignment?
> 


Because the comma is in scalar context (it's in void context, but that's
a special case of scalar context), it will apply scalar context when
it evaluates its arguments. 

Its leftmost argument is an assigment. Hence, the assignment will be
evaluated in scalar context. On the LHS of the assignment is a list,
which makes the assignment is list assignment (in scalar context). Because
it's a list assignment, the RHS of the assignment is evaluated in list
context.



The difference between

my ($str, $ref) = "text", { };

and

my ($str, $ref) = ("text", { });

is precedence. In the former expression, the comma (the one following "text")
is the top level operator. In the latter expression, the (list)assignment
is the top level operator. Both expressions have a list assignment, but
only the first expression has a comma in scalar (void) context.



Abigail


Re: Assigning anonymous hash to a list

2013-07-30 Thread Yitzchak Scott-Thoennes
On Tue, Jul 30, 2013 at 3:52 PM, Joseph Werner  wrote:
> Hmmm.  Yitzchak Scott-Thoennes, I recognize, Abigail I do not (perhaps
> I should?)

You can believe anything Abigail says.

Well, except perhaps in the code comments here:
http://perlmonks.org/?node_id=22319

> So, Yitzchak, is this, in fact, a simple matter of operator precedence
> in that the ',' operator is of lower precedence than the assignment
> operator (absurd though that may seem)  AND not a case of a scalar
> value (which is the result of a Perl expression involving a ','
> operator) being offered to a  list assignment?

Yes, as was demonstrated clearly by someone with Deparse and someone
else by enabling warnings (sorry, forget who).


Re: Assigning anonymous hash to a list

2013-07-30 Thread Joseph Werner
Hmmm.  Yitzchak Scott-Thoennes, I recognize, Abigail I do not (perhaps
I should?)

So, Yitzchak, is this, in fact, a simple matter of operator precedence
in that the ',' operator is of lower precedence than the assignment
operator (absurd though that may seem)  AND not a case of a scalar
value (which is the result of a Perl expression involving a ','
operator) being offered to a  list assignment?

Always interested in a learning opportunity,
Christian

On Tue, Jul 30, 2013 at 5:43 PM, Yitzchak Scott-Thoennes
 wrote:
> On Tue, Jul 30, 2013 at 2:32 PM, Joseph Werner  wrote:
>> On Tue, Jul 30, 2013 at 4:51 PM, Abigail  wrote:
>>> By that argument, this is a scalar assignment as well:
>>>
>>>   my ($i1, $i2, $i3) = (4, 5, 6);
>>
>> No, What you have done here is to assigned a list value to an array of
>> assignable elements.
>
> There is *no* array anywhere there.  There are two lists, though.
>
>> I am talking about the example at the top of this thread, which was a
>> scalar assignment to a list of elements.
>
> I can see what you mean when you say that, but it is not correct terminology.
>
> Perl has two assignment operations, list assignment, and scalar assignment.
> Which it is is determined purely based on what is on the left of the 
> assignment.



-- 
Best Regards,
[Joseph] Christian Werner Sr
C 360.920.7183
H 757.304.0502
Txt 757.304.0502


Re: Assigning anonymous hash to a list

2013-07-30 Thread Yitzchak Scott-Thoennes
On Tue, Jul 30, 2013 at 2:32 PM, Joseph Werner  wrote:
> On Tue, Jul 30, 2013 at 4:51 PM, Abigail  wrote:
>> By that argument, this is a scalar assignment as well:
>>
>>   my ($i1, $i2, $i3) = (4, 5, 6);
>
> No, What you have done here is to assigned a list value to an array of
> assignable elements.

There is *no* array anywhere there.  There are two lists, though.

> I am talking about the example at the top of this thread, which was a
> scalar assignment to a list of elements.

I can see what you mean when you say that, but it is not correct terminology.

Perl has two assignment operations, list assignment, and scalar assignment.
Which it is is determined purely based on what is on the left of the assignment.


Re: Assigning anonymous hash to a list

2013-07-30 Thread James Laver

On 30 Jul 2013, at 22:32, Joseph Werner  wrote:

> No, What you have done here is to assigned a list value to an array of
> assignable elements.
> 
> I am talking about the example at the top of this thread, which was a
> scalar assignment to a list of elements.

You've seen what perl thinks of it (in the form of opcodes executed) and it 
isn't what you think it thinks. Please stop telling people it's raining when 
you're standing dry in the sunshine.

Abigail is…Abigail. He's usually right.

James


Re: Assigning anonymous hash to a list

2013-07-30 Thread Joseph Werner
On Tue, Jul 30, 2013 at 4:51 PM, Abigail  wrote:


> So?
>
> By that argument, this is a scalar assignment as well:
>
>   my ($i1, $i2, $i3) = (4, 5, 6);
>

No, What you have done here is to assigned a list value to an array of
assignable elements.

I am talking about the example at the top of this thread, which was a
scalar assignment to a list of elements.



And sorry if my message was not clean; here I only make the point that
the comma operator is a valid component of a Perl expression.

>>
>> The comma operator is a valid component of a Perl expression.
>>
>> my $str = 'text', {a => 1, b => 2, c => 3};
>> say $str;
>>
>> which gives:
>>
>> Useless use of anonymous hash ({}) in void context at test.pl line 5.
>> text


And here I refer to the subject expression of this thread.

>> Again, this is a simple assignment of a scalar value to the first
>> element of a list, precedence is not involved.
>
>
> Bzzzt. Wrong. Again.
>



-- 
Best Regards,
[Joseph] Christian Werner Sr
C 360.920.7183
H 757.304.0502
Txt 757.304.0502


Re: Assigning anonymous hash to a list

2013-07-30 Thread Smylers
gvim writes:

> On 30/07/2013 20:09, Joseph Werner wrote:
> 
> > It is because you are not assigning a list value to a list.  You are
> > assigning a scalar value that is the result of a ',' expression  to
> > the first element in the list.
> 
> Got it. Nothing to do with the hashref. Should have used parens ...

Yes!

> ... to create list context.

No -- you already had list context!

But , has lower precedence than = does (see perldoc perlop). So your
statement:

  my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};

is parsed as first do this -- which is a list-context assignment:

  my ($str, $ref) = 'text'

and then 'do' this -- which is just some data, in void context:

  {a => 1, b => 2, c => 3}

The extra parens on the right don't change any context; they just
restrict the comma to only operating inside those parens, rather than
splitting up your statement in an unwanted place.

Smylers
-- 
Stop drug companies hiding negative research results.
Sign the AllTrials petition to get all clinical research results published.
Read more: http://www.alltrials.net/blog/the-alltrials-campaign/


Re: Assigning anonymous hash to a list

2013-07-30 Thread Abigail
On Tue, Jul 30, 2013 at 04:33:33PM -0400, Joseph Werner wrote:
> I still disagree.  This is a straightforward assignment to the first
> element of a list.
> 
> In Perl, if you assign a scalar value to a list, the first variable in
> the list will take that value, if it is assignable:
> 
> my ($i1, $i2, $i3) = 4;
> 
> say "\$i1 = ", $i1;
> say "\$i2 = ", $i2;
> say "\$i3 = ", $i3;
> 
> which gives:
> 
> $i1 = 4
> Use of uninitialized value $i2 in say at test.pl line 11.
> $i2 =
> Use of uninitialized value $i3 in say at test.pl line 12.
> $i3 =
> 
> Here I have assigned the scalar value 4 to the list element $i1, which
> is assignable.

So?

By that argument, this is a scalar assignment as well:

  my ($i1, $i2, $i3) = (4, 5, 6);

as you have assigned the scalar value 4 to list element $i1.


   my ($i1, $i2, $i3) = sub {wantarray ? "list" : "scalar"} -> ();
   say $i1;
   __END__
   list

$i2 and $i3 are undefined, $i1 contains the word "list", because Perl
thinks, unlike you, that it's a list assignment.


> 
> The comma operator is a valid component of a Perl expression.
> 
> my $str = 'text', {a => 1, b => 2, c => 3};
> say $str;
> 
> which gives:
> 
> Useless use of anonymous hash ({}) in void context at test.pl line 5.
> text
> 
> Again, this is a simple assignment of a scalar value to the first
> element of a list, precedence is not involved.


Bzzzt. Wrong. Again. Here, due to the absense of parens around '$str',
there's *NO* list on the LHS of the assignment. And that makes it a
scalar assignment:

  $ perl -MO=Terse -e 'my $str = "text", { }'
  LISTOP (0x9eac898) leave [1] 
  OP (0x9eac8b8) enter 
  COP (0x9eac970) nextstate 
  LISTOP (0x9eac930) list 
  OP (0x9ea28a0) pushmark 
  ->  BINOP (0x9eaca58) sassign 
  SVOP (0x9eacb08) const  PV (0x9ea6b88) "text" 
  OP (0x9eabbf0) padsv [1] 
  LISTOP (0x9eac9a8) anonhash 
  OP (0x9ea20c0) pushmark 
  -e syntax OK
  $


Note the line "BINOP (0x9eaca58) sassign". *s*assign. Not *a*assign.
Which you would get if you write "my ($str)":


  $ perl -MO=Terse -e 'my ($str) = "text", { }'
  LISTOP (0x8475d30) leave [1] 
  OP (0x8525d30) enter 
  COP (0x8476970) nextstate 
  LISTOP (0x84768d0) list 
  OP (0x846c8a0) pushmark 
  ->  BINOP (0x8476950) aassign [2] 
  UNOP (0x84769a8) null [146] 
  OP (0x8476b40) pushmark 
  SVOP (0x8476b08) const  PV (0x8470b88) "text" 
  UNOP (0x8476a58) null [146] 
  OP (0x846c0c0) pushmark 
  OP (0x8475bf0) padsv [1] 
  LISTOP (0x8476930) anonhash 
  OP (0x84768b8) pushmark 
  -e syntax OK
  $




> 
> Christian
> 
> On Tue, Jul 30, 2013 at 3:49 PM, Abigail  wrote:
> > On Tue, Jul 30, 2013 at 03:34:48PM -0400, Joseph Werner wrote:
> >> I disagree.
> >>
> >> This is a straightforward  assignment to the first element of a list.
> >> Precedence is not involved. A scalar assignment vs a list assignment
> >> is the issue.
> >>
> >
> >
> > Thank you for playing.
> >
> >
> > You are right it's straighforward, but you're wrong that it's scalar
> > assignment vs list assignment.
> >
> > The fact there's "my ($str, $ref)" on the LHS of the assignment makes
> > that Perl considers this a list assignment:
> >
> >
> >   $ perl -MO=Terse -e 'my ($str, $ref) = "text", {a => 1, b => 2, c => 3}'
> >   LISTOP (0x100324de0) leave [1]
> >   OP (0x100324e20) enter
> >   COP (0x100324d90) nextstate
> >   LISTOP (0x100301f10) list
> >   OP (0x100301ee0) pushmark
> >   BINOP (0x1003093c0) aassign [3]
> >   UNOP (0x100309950) null [148]
> >   OP (0x100309390) pushmark
> >   SVOP (0x100309d90) const  PV (0x1008143c0) "text"
> >   UNOP (0x100329530) null [148]
> >   OP (0x100329570) pushmark
> >   OP (0x1003096e0) padsv [1]
> >   OP (0x100309600) padsv [2]
> >   LISTOP (0x100309460) anonhash
> >   OP (0x1003094a0) pushmark
> >   SVOP (0x100309400) const  PV (0x100814408) "a"
> >   SVOP (0x100309430) const  IV (0x1008143f0) 1
> >   SVOP (0x1003094d0) const  PV (0x100814048) "b"
> >   SVOP (0x100309500) const  IV (0x1008143a8) 2
> >   SVOP (0x100309530) const  PV (0x100814378) "c"
> >   SVOP (0x100309560) const  IV (0x100814390) 3
> >   -e syntax OK
> >   $
> >
> >
> > Note the line: BINOP (0x1003093c0) aassign [3], and compare:
> >
> >   $ perl -MO=Terse -e 'my ($str, $ref) = ("text", {a => 1, b => 2, c => 3})'
> >   LISTOP (0x100324d90) leave [1]
> >   OP (0x100324dd0) enter
> >   COP (0x100324d40) nextstate
> >   BINOP (0x100309570) aassign [3]
> >   UNOP (0x100301f10) null [148]
> >   OP (0x100301ee0) pushmark
> >   SVOP (0x100309d90) const  PV (0x1008143c0) "text"
> >   LISTOP (0x

Re: Assigning anonymous hash to a list

2013-07-30 Thread Joseph Werner
I still disagree.  This is a straightforward assignment to the first
element of a list.

In Perl, if you assign a scalar value to a list, the first variable in
the list will take that value, if it is assignable:

my ($i1, $i2, $i3) = 4;

say "\$i1 = ", $i1;
say "\$i2 = ", $i2;
say "\$i3 = ", $i3;

which gives:

$i1 = 4
Use of uninitialized value $i2 in say at test.pl line 11.
$i2 =
Use of uninitialized value $i3 in say at test.pl line 12.
$i3 =

Here I have assigned the scalar value 4 to the list element $i1, which
is assignable.

The comma operator is a valid component of a Perl expression.

my $str = 'text', {a => 1, b => 2, c => 3};
say $str;

which gives:

Useless use of anonymous hash ({}) in void context at test.pl line 5.
text

Again, this is a simple assignment of a scalar value to the first
element of a list, precedence is not involved.

Christian

On Tue, Jul 30, 2013 at 3:49 PM, Abigail  wrote:
> On Tue, Jul 30, 2013 at 03:34:48PM -0400, Joseph Werner wrote:
>> I disagree.
>>
>> This is a straightforward  assignment to the first element of a list.
>> Precedence is not involved. A scalar assignment vs a list assignment
>> is the issue.
>>
>
>
> Thank you for playing.
>
>
> You are right it's straighforward, but you're wrong that it's scalar
> assignment vs list assignment.
>
> The fact there's "my ($str, $ref)" on the LHS of the assignment makes
> that Perl considers this a list assignment:
>
>
>   $ perl -MO=Terse -e 'my ($str, $ref) = "text", {a => 1, b => 2, c => 3}'
>   LISTOP (0x100324de0) leave [1]
>   OP (0x100324e20) enter
>   COP (0x100324d90) nextstate
>   LISTOP (0x100301f10) list
>   OP (0x100301ee0) pushmark
>   BINOP (0x1003093c0) aassign [3]
>   UNOP (0x100309950) null [148]
>   OP (0x100309390) pushmark
>   SVOP (0x100309d90) const  PV (0x1008143c0) "text"
>   UNOP (0x100329530) null [148]
>   OP (0x100329570) pushmark
>   OP (0x1003096e0) padsv [1]
>   OP (0x100309600) padsv [2]
>   LISTOP (0x100309460) anonhash
>   OP (0x1003094a0) pushmark
>   SVOP (0x100309400) const  PV (0x100814408) "a"
>   SVOP (0x100309430) const  IV (0x1008143f0) 1
>   SVOP (0x1003094d0) const  PV (0x100814048) "b"
>   SVOP (0x100309500) const  IV (0x1008143a8) 2
>   SVOP (0x100309530) const  PV (0x100814378) "c"
>   SVOP (0x100309560) const  IV (0x100814390) 3
>   -e syntax OK
>   $
>
>
> Note the line: BINOP (0x1003093c0) aassign [3], and compare:
>
>   $ perl -MO=Terse -e 'my ($str, $ref) = ("text", {a => 1, b => 2, c => 3})'
>   LISTOP (0x100324d90) leave [1]
>   OP (0x100324dd0) enter
>   COP (0x100324d40) nextstate
>   BINOP (0x100309570) aassign [3]
>   UNOP (0x100301f10) null [148]
>   OP (0x100301ee0) pushmark
>   SVOP (0x100309d90) const  PV (0x1008143c0) "text"
>   LISTOP (0x1003093c0) anonhash
>   OP (0x100309400) pushmark
>   SVOP (0x100309950) const  PV (0x100814450) "a"
>   SVOP (0x100309390) const  IV (0x100814408) 1
>   SVOP (0x100309430) const  PV (0x1008143f0) "b"
>   SVOP (0x100309460) const  IV (0x100814048) 2
>   SVOP (0x100309490) const  PV (0x1008143a8) "c"
>   SVOP (0x1003094c0) const  IV (0x100814378) 3
>   UNOP (0x100329530) null [148]
>   OP (0x100329570) pushmark
>   OP (0x1003096e0) padsv [1]
>   OP (0x100309600) padsv [2]
>   -e syntax OK
>   $
>
>
>
> Abigail



-- 
Best Regards,
[Joseph] Christian Werner Sr
C 360.920.7183
H 757.304.0502
Txt 757.304.0502


Re: Assigning anonymous hash to a list

2013-07-30 Thread Abigail
On Tue, Jul 30, 2013 at 07:54:46PM +0100, gvim wrote:
> Can anyone explain why this works:
>
> my $ref = {a => 1,  b => 2, c => 3};
> say $ref->{b}; #  Result: 2
>
> ... but this doesn't :
>
> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
> say $ref->{b};   # Result: Use of uninitialized value
>
> Seems a little inconsistent.


You could have asked Perl

  $ perl -we 'my ($str, $ref) = "text", {a => 1, b => 2, c => 3}'
  Useless use of anonymous hash ({}) in void context at -e line 1.
  $


Abigail


Re: Assigning anonymous hash to a list

2013-07-30 Thread Abigail
On Tue, Jul 30, 2013 at 03:34:48PM -0400, Joseph Werner wrote:
> I disagree.
> 
> This is a straightforward  assignment to the first element of a list.
> Precedence is not involved. A scalar assignment vs a list assignment
> is the issue.
> 


Thank you for playing.


You are right it's straighforward, but you're wrong that it's scalar
assignment vs list assignment. 

The fact there's "my ($str, $ref)" on the LHS of the assignment makes
that Perl considers this a list assignment:


  $ perl -MO=Terse -e 'my ($str, $ref) = "text", {a => 1, b => 2, c => 3}'
  LISTOP (0x100324de0) leave [1] 
  OP (0x100324e20) enter 
  COP (0x100324d90) nextstate 
  LISTOP (0x100301f10) list 
  OP (0x100301ee0) pushmark 
  BINOP (0x1003093c0) aassign [3] 
  UNOP (0x100309950) null [148] 
  OP (0x100309390) pushmark 
  SVOP (0x100309d90) const  PV (0x1008143c0) "text" 
  UNOP (0x100329530) null [148] 
  OP (0x100329570) pushmark 
  OP (0x1003096e0) padsv [1] 
  OP (0x100309600) padsv [2] 
  LISTOP (0x100309460) anonhash 
  OP (0x1003094a0) pushmark 
  SVOP (0x100309400) const  PV (0x100814408) "a" 
  SVOP (0x100309430) const  IV (0x1008143f0) 1 
  SVOP (0x1003094d0) const  PV (0x100814048) "b" 
  SVOP (0x100309500) const  IV (0x1008143a8) 2 
  SVOP (0x100309530) const  PV (0x100814378) "c" 
  SVOP (0x100309560) const  IV (0x100814390) 3 
  -e syntax OK
  $


Note the line: BINOP (0x1003093c0) aassign [3], and compare:

  $ perl -MO=Terse -e 'my ($str, $ref) = ("text", {a => 1, b => 2, c => 3})'
  LISTOP (0x100324d90) leave [1] 
  OP (0x100324dd0) enter 
  COP (0x100324d40) nextstate 
  BINOP (0x100309570) aassign [3] 
  UNOP (0x100301f10) null [148] 
  OP (0x100301ee0) pushmark 
  SVOP (0x100309d90) const  PV (0x1008143c0) "text" 
  LISTOP (0x1003093c0) anonhash 
  OP (0x100309400) pushmark 
  SVOP (0x100309950) const  PV (0x100814450) "a" 
  SVOP (0x100309390) const  IV (0x100814408) 1 
  SVOP (0x100309430) const  PV (0x1008143f0) "b" 
  SVOP (0x100309460) const  IV (0x100814048) 2 
  SVOP (0x100309490) const  PV (0x1008143a8) "c" 
  SVOP (0x1003094c0) const  IV (0x100814378) 3 
  UNOP (0x100329530) null [148] 
  OP (0x100329570) pushmark 
  OP (0x1003096e0) padsv [1] 
  OP (0x100309600) padsv [2] 
  -e syntax OK
  $



Abigail


Re: Assigning anonymous hash to a list

2013-07-30 Thread Abigail
On Tue, Jul 30, 2013 at 08:23:30PM +0100, Adrian Lai wrote:
> my ($a, $b) = 'x', 'y';
> say $b; # undef
> 
> my ($a, $b) = ('x', 'y');
> say $b; # y
> 
> I assume Perl interprets as (my ($a, $b) = 'x'), 'y'.
> 


You don't have to assume, you can ask Perl.


  $ perl -MO=Deparse,-p -e 'my ($a, $b) = "x", "y"'
  ((my($a, $b) = 'x'), '???');
  $


Abigail


Re: Assigning anonymous hash to a list

2013-07-30 Thread Abigail
On Tue, Jul 30, 2013 at 08:15:06PM +0100, Peter Flanigan wrote:
> On 30/07/13 19:54, gvim wrote:
> > Can anyone explain why this works:
> > 
> > my $ref = {a => 1,  b => 2, c => 3};
> > say $ref->{b}; #  Result: 2
> > 
> > ... but this doesn't :
> > 
> > my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
> > say $ref->{b};   # Result: Use of uninitialized value
> > 
> > Seems a little inconsistent.
> > 
> > gvim
> > 
> > 
> 
> Try
> 
>my ($str, $ref) = ( 'text', {a => 1, b => 2, c => 3} );
> 
> The extra set of brackets force evaluation in a list context


List context is caused (indirectly) by the parens on the LHS of the
assignment. The added parens on the RHS do diddly squat for context.
They're there for *precedence*. Their act is played at parse time,
and they don't come back for an encore at compile time, nor run time.


Abigail


Re: Assigning anonymous hash to a list

2013-07-30 Thread Joseph Werner
I disagree.

This is a straightforward  assignment to the first element of a list.
Precedence is not involved. A scalar assignment vs a list assignment
is the issue.

Christian

(oh boy, call out the hounds...)


On Tue, Jul 30, 2013 at 3:19 PM, Paul LeoNerd  wrote:
> On Tue, 30 Jul 2013 19:54:46 +0100
> gvim  wrote:
>
>> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
>
> Precedence.
>
> This parses as
>
>   (  my ( $str, $ref ) = 'text' ),   { a => 1, b => 2, c => 3 };
>
> To make it work as you expect use parens on the RHS as well:
>
>   my ( $str, $ref ) = ( 'text', { a => 1, b => 2, c => 3 } );
>
> --
> Paul "LeoNerd" Evans
>
> leon...@leonerd.org.uk
> ICQ# 4135350   |  Registered Linux# 179460
> http://www.leonerd.org.uk/



-- 
Best Regards,
[Joseph] Christian Werner Sr
C 360.920.7183
H 757.304.0502
Txt 757.304.0502


Re: Assigning anonymous hash to a list

2013-07-30 Thread gvim

On 30/07/2013 20:11, Mark Stringer wrote:

Not sure why it's inconsistent. This works as you'd expect. Note the
parens.

my ($str, $ref) = ('text', {a => 1, b => 2, c => 3});

Mark


I'm confusing arg lists with list assignment.

gvim



Re: Assigning anonymous hash to a list

2013-07-30 Thread Hakim Cassimally
On 30 July 2013 19:54, gvim  wrote:

> Can anyone explain why this works:
>
> my $ref = {a => 1,  b => 2, c => 3};
> say $ref->{b}; #  Result: 2
>
> ... but this doesn't :
>
> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
> say $ref->{b};   # Result: Use of uninitialized value
>
> Seems a little inconsistent.


It's not inconsistent.  Just because your language can do assignment
doesn't mean it can do destructuring bind.

As it happens, Perl *can* do destructuring bind.  You want parentheses
around the list though:

my ($str, $ref) = ('text', {a => 1, b => 2, c => 3});
say $ref->{b};

(Your line parses the hash reference in void context, as you'd see if
you're using warnings.)

osf'


Re: Assigning anonymous hash to a list

2013-07-30 Thread Adrian Lai
my ($a, $b) = 'x', 'y';
say $b; # undef

my ($a, $b) = ('x', 'y');
say $b; # y

I assume Perl interprets as (my ($a, $b) = 'x'), 'y'.

Adrian.


On 30 July 2013 19:54, gvim  wrote:

> Can anyone explain why this works:
>
> my $ref = {a => 1,  b => 2, c => 3};
> say $ref->{b}; #  Result: 2
>
> ... but this doesn't :
>
> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
> say $ref->{b};   # Result: Use of uninitialized value
>
> Seems a little inconsistent.
>
> gvim
>


Re: Assigning anonymous hash to a list

2013-07-30 Thread gvim

On 30/07/2013 20:09, Joseph Werner wrote:

It is because you are not assigning a list value to a list.  You are
assigning a scalar value that is the result of a ',' expression  to
the first element in the list.

Hope this helps.

Christian


Got it. Nothing to do with the hashref. Should have used parens to 
create list context.


gvim


Re: Assigning anonymous hash to a list

2013-07-30 Thread LeoNerd
On Tue, 30 Jul 2013 19:54:46 +0100
gvim  wrote:

> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};

Precedence.

This parses as 

  (  my ( $str, $ref ) = 'text' ),   { a => 1, b => 2, c => 3 };

To make it work as you expect use parens on the RHS as well:

  my ( $str, $ref ) = ( 'text', { a => 1, b => 2, c => 3 } );

-- 
Paul "LeoNerd" Evans

leon...@leonerd.org.uk
ICQ# 4135350   |  Registered Linux# 179460
http://www.leonerd.org.uk/


signature.asc
Description: PGP signature


Re: Assigning anonymous hash to a list

2013-07-30 Thread Peter Flanigan
On 30/07/13 19:54, gvim wrote:
> Can anyone explain why this works:
> 
> my $ref = {a => 1,  b => 2, c => 3};
> say $ref->{b}; #  Result: 2
> 
> ... but this doesn't :
> 
> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
> say $ref->{b};   # Result: Use of uninitialized value
> 
> Seems a little inconsistent.
> 
> gvim
> 
> 

Try

   my ($str, $ref) = ( 'text', {a => 1, b => 2, c => 3} );

The extra set of brackets force evaluation in a list context

-- 

Regards


Re: Assigning anonymous hash to a list

2013-07-30 Thread Matt Lawrence
Don't you need parentheses on both sides of that assignment? 


Sent from Samsung Mobile

 Original message 
From: gvim  
Date:  
To: London PM  
Subject: Assigning anonymous hash to a list 
 
Can anyone explain why this works:

my $ref = {a => 1,  b => 2, c => 3};
say $ref->{b}; #  Result: 2

... but this doesn't :

my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
say $ref->{b};   # Result: Use of uninitialized value

Seems a little inconsistent.

gvim


Re: Assigning anonymous hash to a list

2013-07-30 Thread Mark Stringer

Not sure why it's inconsistent. This works as you'd expect. Note the parens.

my ($str, $ref) = ('text', {a => 1, b => 2, c => 3});

Mark

On 07/30/2013 07:54 PM, gvim wrote:

Can anyone explain why this works:

my $ref = {a => 1,  b => 2, c => 3};
say $ref->{b}; #  Result: 2

... but this doesn't :

my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
say $ref->{b};   # Result: Use of uninitialized value

Seems a little inconsistent.

gvim




Re: Assigning anonymous hash to a list

2013-07-30 Thread Fahad Khan
ITYM,

my ($str, $ref) = ('text', {a => 1, b => 2, c => 3});
say $ref->{b};   # Result: 2


extra () are needed.


On Tue, Jul 30, 2013 at 7:54 PM, gvim  wrote:

> Can anyone explain why this works:
>
> my $ref = {a => 1,  b => 2, c => 3};
> say $ref->{b}; #  Result: 2
>
> ... but this doesn't :
>
> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
> say $ref->{b};   # Result: Use of uninitialized value
>
> Seems a little inconsistent.
>
> gvim
>


Re: Assigning anonymous hash to a list

2013-07-30 Thread Joseph Werner
It is because you are not assigning a list value to a list.  You are
assigning a scalar value that is the result of a ',' expression  to
the first element in the list.

Hope this helps.

Christian

On Tue, Jul 30, 2013 at 2:54 PM, gvim  wrote:
> Can anyone explain why this works:
>
> my $ref = {a => 1,  b => 2, c => 3};
> say $ref->{b}; #  Result: 2
>
> ... but this doesn't :
>
> my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
> say $ref->{b};   # Result: Use of uninitialized value
>
> Seems a little inconsistent.
>
> gvim



-- 
Best Regards,
[Joseph] Christian Werner Sr
C 360.920.7183
H 757.304.0502
Txt 757.304.0502


Assigning anonymous hash to a list

2013-07-30 Thread gvim

Can anyone explain why this works:

my $ref = {a => 1,  b => 2, c => 3};
say $ref->{b}; #  Result: 2

... but this doesn't :

my ($str, $ref) = 'text', {a => 1, b => 2, c => 3};
say $ref->{b};   # Result: Use of uninitialized value

Seems a little inconsistent.

gvim