FAQ 4.55 How do I process an entire hash?

Discussion in 'Perl Misc' started by PerlFAQ Server, Apr 7, 2011.

  1. This is an excerpt from the latest version perlfaq4.pod, which
    comes with the standard Perl distribution. These postings aim to
    reduce the number of repeated questions as well as allow the community
    to review and update the answers. The latest version of the complete
    perlfaq is at http://faq.perl.org .


    4.55: How do I process an entire hash?

    (contributed by brian d foy)

    There are a couple of ways that you can process an entire hash. You can
    get a list of keys, then go through each key, or grab a one key-value
    pair at a time.

    To go through all of the keys, use the "keys" function. This extracts
    all of the keys of the hash and gives them back to you as a list. You
    can then get the value through the particular key you're processing:

    foreach my $key ( keys %hash ) {
    my $value = $hash{$key}

    Once you have the list of keys, you can process that list before you
    process the hash elements. For instance, you can sort the keys so you
    can process them in lexical order:

    foreach my $key ( sort keys %hash ) {
    my $value = $hash{$key}

    Or, you might want to only process some of the items. If you only want
    to deal with the keys that start with "text:", you can select just those
    using "grep":

    foreach my $key ( grep /^text:/, keys %hash ) {
    my $value = $hash{$key}

    If the hash is very large, you might not want to create a long list of
    keys. To save some memory, you can grab one key-value pair at a time
    using "each()", which returns a pair you haven't seen yet:

    while( my( $key, $value ) = each( %hash ) ) {

    The "each" operator returns the pairs in apparently random order, so if
    ordering matters to you, you'll have to stick with the "keys" method.

    The "each()" operator can be a bit tricky though. You can't add or
    delete keys of the hash while you're using it without possibly skipping
    or re-processing some pairs after Perl internally rehashes all of the
    elements. Additionally, a hash has only one iterator, so if you use
    "keys", "values", or "each" on the same hash, you can reset the iterator
    and mess up your processing. See the "each" entry in perlfunc for more


    The perlfaq-workers, a group of volunteers, maintain the perlfaq. They
    are not necessarily experts in every domain where Perl might show up,
    so please include as much information as possible and relevant in any
    corrections. The perlfaq-workers also don't have access to every
    operating system or platform, so please include relevant details for
    corrections to examples that do not work on particular platforms.
    Working code is greatly appreciated.

    If you'd like to help maintain the perlfaq, see the details in
    PerlFAQ Server, Apr 7, 2011
    1. Advertisements

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. rp
    red floyd
    Nov 10, 2011
  2. Srijayanth Sridhar
    David A. Black
    Jul 2, 2008
  3. PerlFAQ Server
    PerlFAQ Server
    Jan 26, 2011
  4. PerlFAQ Server

    FAQ 5.43 How do I copy an entire directory?

    PerlFAQ Server, Feb 27, 2011, in forum: Perl Misc
    PerlFAQ Server
    Feb 27, 2011
  5. PerlFAQ Server
    PerlFAQ Server
    Mar 16, 2011

Share This Page