Now that I’m on examples like this, there’s yet another wart to watch for:


$a=rvals(5,5)
$b = $a;
$c = $b->sever;
$c->(0) .= 100;

will change $a!!!

That is because the “$b=$a” does not create a flow relationship (as understood 
by PDL).  It literally copies the pointer to $a so that $b and $a refer to 
exactly the same data structure.  

All that arises because Perl 5 doesn’t allow overloading of ordinary 
assignment.  So in the above example, there’s no dataflow relationship to sever 
between $a and $b:  they are literally the same PDL.

In the below example (from my last email) $a and $b are different PDLs that 
have a dataflow relationship.


> On Aug 26, 2016, at 11:09 AM, Craig DeForest <[email protected]> 
> wrote:
> 
> The “sever" severs $a from its flow affiliates (if any), returning the 
> severed child ($a).
> 
> You seem to be expecting “sever” to act like “copy”.  That is an API wart, 
> and may need improvement in the documentation.  It is specifically called out 
> in the current “sever” documentation, but may not be prominent enough.
> 
> If you’d said:
> 
> $a = rvals(5,5)
> $b = $a->(:,:);
> $c = $b->sever;
> 
> $c->(0) .= 100;
> 
> then $a would be unchanged (although $b would be changed).
> 
> 
> 
>> On Aug 26, 2016, at 4:23 AM, Ingo Schmid <[email protected]> wrote:
>> 
>> 
>> Hi,
>> 
>> I got this unexpected behaviour recently: I think it is a bug. If it is,
>> it is very serious, I would say.
>> v2.016.
>> 
>> Ingo
>> 
>> pdl> $a=rvals(5,5)
>> 
>> pdl> $b=$a->sever
>> 
>> pdl> p $a
>> 
>> [
>> [ 2.8284271   2.236068          2   2.236068  2.8284271]
>> [  2.236068  1.4142136          1  1.4142136   2.236068]
>> [         2          1          0          1          2]
>> [  2.236068  1.4142136          1  1.4142136   2.236068]
>> [ 2.8284271   2.236068          2   2.236068  2.8284271]
>> ]
>> 
>> 
>> pdl> p $b
>> 
>> [
>> [ 2.8284271   2.236068          2   2.236068  2.8284271]
>> [  2.236068  1.4142136          1  1.4142136   2.236068]
>> [         2          1          0          1          2]
>> [  2.236068  1.4142136          1  1.4142136   2.236068]
>> [ 2.8284271   2.236068          2   2.236068  2.8284271]
>> ]
>> 
>> 
>> pdl> $b(0,).=100
>> 
>> pdl> p $b
>> 
>> [
>> [       100   2.236068          2   2.236068  2.8284271]
>> [       100  1.4142136          1  1.4142136   2.236068]
>> [       100          1          0          1          2]
>> [       100  1.4142136          1  1.4142136   2.236068]
>> [       100   2.236068          2   2.236068  2.8284271]
>> ]
>> 
>> 
>> pdl> p $a
>> 
>> [
>> [       100   2.236068          2   2.236068  2.8284271]
>> [       100  1.4142136          1  1.4142136   2.236068]
>> [       100          1          0          1          2]
>> [       100  1.4142136          1  1.4142136   2.236068]
>> [       100   2.236068          2   2.236068  2.8284271]
>> ]
>> 
>> 
>> 
>> ------------------------------------------------------------------------------
>> _______________________________________________
>> pdl-general mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/pdl-general
>> 
> 
> 


------------------------------------------------------------------------------
_______________________________________________
pdl-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pdl-general

Reply via email to