It is humiliating to constantly live with your dreams 2 steps further away than your skill set.
I have a working simple "compute a weighted average over time periods" program written and tested. Now it must grow to handle:
  • an arbitrary number of independent data streams.
  • live in threads::shared space (why no OO or modules used)

    I am attempting to create a shared hash, with each keyed member containing scalars for period start, period end, period total; and an array of decay stages. The initialization currently does not cause any error messages:

    our %WA: shared; our $WAlock: shared; ... my ($key, $dtg, $bytes) = @_; if (!defined $WA{$key}) { { lock $WAlock; $WA{$key} = &share({}); #hook shared anon hash; { lock $WA{$key}; $WA{$key}{PS}=$dtg; # PS period Start $WA{$key}{PE}=$dtg + $secs; # PE period End $WA{$key}{PT}=0; # PT period Total $WA{$key}{stgs} =(); # list of decaying values for my $i (0..$rnds-1){ $WA{$key}{stags}[$i]=0; # init all stages to 0 } } } } # end of (! defined) entry being initialized
    Clean compile does not mean this really does what I want.

    The problem is when I attempt to do some array manipulations (unshift) on the set of decay stages. Here I am trying (unsuccessfully) to address the array for the 'unshift' command.

    sub reportWA{ # $key my $key = shift; my $NewWA; unshift @{WA{$key}{stags}}, $WA{$key}{PT}; #insert PT at [0] -line +110 $NewWA=$WA{$key}{PT}; # $periodTotal * 1 $#{@{WA{$key}{stags}}} = $rnds-1; # truncate off oldest stage for my $i (1..$rnds-1){ ${WA{$key}{stags}}[$i] *= $wght; #stag[n] = initial * (wght**n) $NewWA += ${WA{$key}{stags}}[$i]; } #plog sprintf "stages = %s" ,join (", ",@stags); $NewWA /= $rnds; printf " %d %d %8.2f %s\n" , $key,$WA{$key}{PE} ,$NewWA, join (", ",@{WA{$key}{stags}}); } ------- Errors generated start with these : Scalar value @{WA{$key} better written as ${WA{$key} at ThWgtAvg1.pl l +ine 110. Useless use of unshift with no values at ThWgtAvg1.pl line 110. Scalar value @{WA{$key} better written as ${WA{$key} at ThWgtAvg1.pl l +ine 113. Scalar value @{WA{$key} better written as ${WA{$key} at ThWgtAvg1.pl l +ine 121. Type of arg 1 to unshift must be array (not hash slice) at ThWgtAvg1.p +l line 110, near "}{stags" syntax error at ThWgtAvg1.pl line 110, near "}{stags" ...
    So ... I am lost the forest of braces and brackets... How do I code access to that 'stags' list? <<bow>>

    In reply to Referencing an array in a complex hashed data structure by Wiggins

    Title:
    Use:  <p> text here (a paragraph) </p>
    and:  <code> code here </code>
    to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.