eagle504 has asked for the wisdom of the Perl Monks concerning the following question:

Okay monks, here's a quick question based on the usage of Hash::MostUtils 'hashgrep' function. Currently, I'm reading in an EMF curve for that has ideal values of state-of-charge and equivalent voltage based on the state-of-charge. I read these values in as a pairwise structure. $a=state-of-charge, $b=voltage. However, I'm running into some issues when I do a quick lookup of where I'm at in the table. It's returning a null or zero in most cases, and not an array or list as I'd expect.

my @match = hashgrep { $SOCCalc >= $a } %$dischargelookuphash;

Any ideas what I'm doing wrong. I successfully employed this type of lookup in arrays, but they are terribly inefficient and I'd like to get this to work since its about 32000 lines that I process that I use this for in a sub. I was thinking about going native and writing in c++, but I really want to get this to work in perl. Any help would be appreciated.

Replies are listed 'Best First'.
Re: Hash Lookup
by choroba (Cardinal) on Aug 21, 2015 at 12:59 UTC
    Note that hashgrep returns both keys and values, so you should have a hash on the left hand side of the assignment. If you are just interested in the keys, you can use normal grep with keys:
    my @match = grep { $SOCCalc >= $_ } keys %$dischargelookuphash;

    If you want to frequently extract ranges from a structure, hash is probably not the best tool for the job. A heap or a tree might serve you better.

    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: Hash Lookup
by Anonymous Monk on Aug 21, 2015 at 13:00 UTC
Re: Hash Lookup
by anonymized user 468275 (Curate) on Aug 21, 2015 at 14:02 UTC
    Firstly I'd avoid using $a and $b (in case they interfere with sort functions you may write later). Next, it is probably best to first write what you mean and then decide whether it needs factorising into a grep. But we can't know that without knowing what your pairwise structure looks like.

    One world, one people

      Firstly I'd avoid using $a and $b (in case they interfere with sort functions you may write later).

      Please read the docs of the module the OP is using, Hash::MostUtils.

        Beware: People are all too apt to ask for a solution to the wrong problem, hence we have no way of knowing given the lack of code so far whether this module is even a reasonable choice.

        One world, one people