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

Is there an easy way to determine if an array element (i.e. 1.3.6.1.2.1.2.2.1.15.27) already exists without having to iterate through the entire data structure?

I'm using the following data:

$VAR1 = { 'response_1.3.6.1.2.1.2.2.1.12.27' => { 'Time_Arrived' => '16:14:13.8', 'Error_Status' => 'No error', 'OID_NAME' => [ [], [ '1.3.6.1.2.1.2.2.1.11.27', 'ifInUcastPkts.27', 1 ], [ '1.3.6.1.2.1.2.2.1.15.27', 'ifInUnknownProtos.27', 1 ], [ '1.3.6.1.2.1.2.2.1.14.27', 'ifInErrors.27', 1 ],

Replies are listed 'Best First'.
•Re: Array elements in a hash
by merlyn (Sage) on Mar 24, 2003 at 20:09 UTC
    As we sometimes say, "arrays are for ordering, hashes are for searching". If you have an array and you want to search it, you either have to turn it into a hash, or do a linear search. That's the case here.

    -- Randal L. Schwartz, Perl hacker
    Be sure to read my standard disclaimer if this is a reply.

Re: Array elements in a hash
by dragonchild (Archbishop) on Mar 24, 2003 at 20:08 UTC
    grep is a good place to start. Read up on it and map. They're the basis for the list operators. To answer your direct question:
    if (grep { $thing_to_look_for } @{$VAR1{$x}{OID_NAME}}) { # Do something cool }
    A better thing, however, would be to figure out what you want to be able to ask your data, then structure it as such. You're allowed to represent your data within your program any way you want to. You don't have to take the first representation that comes along. Presumably, that representation was for some other programmer's questions, not yours.

    ------
    We are the carpenters and bricklayers of the Information Age.

    Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement.

    Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified.

      Thanks dragonchild,
      I always forget about using grep (working on win_32)

      One more question, do you know if it's possible to determine the indice of the element in the array using grep?

      Thanks!

        It all depends on what you grep for. Think about it this way - you're taking a list and creating another list from it, applying some criterion to determine if you should include that element or not. It can be a list of anything you want, not just necessarily the elements of the array.

        The following snippets below are identical:

        my @positive_indices = grep { $arr[$_] > 0 } 0 .. $#arr; my @negative_indices = grep { $arr[$_] < 0 } 0 .. $#arr; #### my @positive_indices = map { $arr[$_] > 0 ? $_ : () } 0 .. $#arr; my @negative_indices = map { $arr[$_] < 0 ? $_ : () } 0 .. $#arr; #### my @positive_indices; my @negative_indices; for (0 .. $#arr) { push @positive_indices, $_ if $arr[$_] > 0; push @negative_indices, $_ if $arr[$_] > 0; }

        ------
        We are the carpenters and bricklayers of the Information Age.

        Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement.

        Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified.