vinforget,
It seems to me that what makes this problem difficult to solve without a loop is that you want the next key after a specified key that is defined. I do not know how much more efficient the following logic would be then a loop. I imagine it depends on the size of the hash and the location of the key.

  • If the desired key does not exist, return undef
  • If the desired key is defined, return the value
  • If not, create an array of sorted hash keys that are defined + target key
    my @keys = grep { defined $hash{$_} || $_ eq $key } sort keys %hash;
  • Use a binary search to find the index of the target key and return the array element one higher
  • It is your choice if it should loop around to the first key if it is the last element or return undef

    I am too tired at the moment (just started a new job) to actually write this code, but the binary search should be noticeably faster on large hashes especially if the target key is not at the beginning. If you are interested I will update it later.

    Cheers - L~R


    In reply to Re: retrieve next avaiable element in sorted hash by Limbic~Region
    in thread retrieve next avaiable element in sorted hash by vinforget

    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.