in reply to Re^11: an algorithm to randomly pick items that are present at different frequencies
in thread an algorithm to randomly pick items that are present at different frequencies

Yes, that was it. I'm new to the arrow notation, anonymous subroutines, etc., and I'm afraid I'm still a bit puzzled by this, but adding the second line here in the main body of the script makes things work:

my $pick = genPickerConverted(\%kmer_prob); $pick = $pick -> ();

(Before I had only the first line.) When I talk about my code never entering the return block in the anonymous subroutine, I just mean that I add a pause/block in the debugger I'm using (Komodo) and then step through the code, looking at the contents of the variables as I go. When I'm stepping through within the "genPickerConverted" subroutine, I see all the variables being created as expected, but then when it gets to the anonymous subroutine, it just jumps back to the main body of the script. Then looking in "$pick", it looks empty. However, I guess I should have gotten a clue because in the "type" column, all of my hashes are listed as "HASH", all of my arrays are listed as "ARRAY", and all of my scalars are listed as not having a "type", except for $pick, which has type "CODE", and if I print out pick before the dereference statement with the arrow, I get a memory location, like "CODE(0x7f9af358dcb8)".

So what's going on? Does $pick contain a reference to the anonymous subroutine, and it also remembers what was in my %kmer_prob hash?

Thanks so very much for the help. I really appreciate it, I've learned a lot, and I was truly stuck.

Eric

  • Comment on Re^12: an algorithm to randomly pick items that are present at different frequencies
  • Download Code

Replies are listed 'Best First'.
Re^13: an algorithm to randomly pick items that are present at different frequencies
by BrowserUk (Patriarch) on Jun 04, 2015 at 23:49 UTC
    Does $pick contain a reference to the anonymous subroutine, and it also remembers what was in my %kmer_prob hash?

    Yes, & yes.

    I suggest that you read section 4 of Perlref - Making references, carefully.

    But, in a nutshell, when you create a subroutine (named or anonymous) it 'remembers' any variables external to that subroutine that it references.

    So, this subroutine:

    my $var = 2; sub x{ print $var; } x(); # prints 2 $var = 3; x(); # prints 3

    For safety, you should isolate closed-over variables so they cannot be changed:

    { my $var = 2; sub x{ print $var }; } ## $var goes out of scope; but x() remembers it. x(); # prints 2; # $var = 3; ## Would be an error my $var = 3; x(); ## Still prints 2; the $var above is a different $var.

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority". I'm with torvalds on this
    In the absence of evidence, opinion is indistinguishable from prejudice. Agile (and TDD) debunked
      Awesome! I'll go through the "Making references" link carefully. Thank you so much for all the help. Eric