Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Hash of arrays

by perlloz (Initiate)
on Dec 28, 2012 at 05:45 UTC ( #1010633=perlquestion: print w/ replies, xml ) Need Help??
perlloz has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I am pushing a user name and an array of AD groups for that user name into a hash of arrays: Code: push (@{$newgrouphash{"$newdn"} },"$newgroup"); Later on in my script I would like to be able to access both the username and the user groups from within the hash of arrays:
foreach $newdn ( keys %newgrouphash ) { foreach $group ( @{$newgrouphash{$newdn}} ) {
However I get the $newdn variable printing twice, once blank and then the actual result. Using a dumper, the info looks fine. Is there a better way of accessing the information in a hash of arrays?

Sorry, new here, I used the print statements from the previous posters suggestions. The actual data being pushed into the HOA is a lot of code and is an AD query so it wouldn't compile. What I end up with is a key of Bob and an array containing groups: domain users, testing, server team etc

push (@{$newgrouphash{"$newdn"} },"$newgroup"); foreach $newdn (sort keys %newgrouphash ) { print "Name:$newdn\n\t"; foreach $group ( sort @{$newgrouphash{$newdn}} ) { + if (!($group =~ /CN=Domain Users/i)) { # print "$group, "; + $res = `dsmod group $group -rmmbr \"$newdn\"`; + print "$res\n";

Comment on Hash of arrays
Select or Download Code
Re: Hash of arrays
by Anonymous Monk on Dec 28, 2012 at 05:57 UTC

    Post real code, code that compiles , code that runs, code that produces output, and the output, code and data insice <c></c> tags ( How do I post a question effectively? )

    Is there a better way of accessing the information in a hash of arrays?

    Not really. You could use Data::Diver, but a HoA is shallow enough not to need it

Re: Hash of arrays
by NetWallah (Abbot) on Dec 28, 2012 at 06:23 UTC
    The basic access syntax code you posted looks fine , but could be better formated using <code> tags:
    foreach $newdn (sort keys %newgrouphash ) { print "Name:$newdn\n\t"; foreach $group ( sort @{$newgrouphash{$newdn}} ) { print "$group, "; } print "\n"; }
    If you print like the code above, the name should print only once.

                 "By three methods we may learn wisdom: First, by reflection, which is noblest; Second, by imitation, which is easiest; and third by experience, which is the bitterest."           -Confucius

      Thanks, I still get this result: Name: Name:CN=test123,OU= etc etc The group prints fine
        How can we know why things get printed twice? The code you showed does not even have a print statement!

        I am pushing a user name and an array of AD groups for that user name into a hash of arrays: Code: push (@{$newgrouphash{"$newdn"} },"$newgroup")
        You are not pushing an array of AD groups into a HoA. You are pushing the stringified version of a scalar into your HoA. For a start, drop all the double quotes around your variables. They serve no purpose. Then check whether $newgroup indeed contains a reference to your array of AD groups.

        And finally show us the code you use to output this data.

        CountZero

        A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

        My blog: Imperial Deltronics

        Thanks, I still get this result: Name: Name:CN=test123,OU= etc etc The group prints fine

        Funny :)

        If you want help, you'll need to provide sample data (as in Data::Dump, Data::Dumper ... ) as Basic debugging checklist explains

        As others have suggested, please post the code where you do the "push", and the "print".

        I re-read your statement:

        I am pushing a user name and an array of AD groups for that user name into a hash of arrays
        So -it sounds like you are pushing both the NAME and the GROUP into the hash value.
        This is in addition to the name being in the Key.

        If this is the case, it would indeed explain the name coming out twice, since you (or at least my posted code) prints the key and value.

        Anyway - this discussion would be a lot less abstract and hypothetical, if you posted your actual code.
        In it's absence, interest in assisting you is rapidly waning.

                     "By three methods we may learn wisdom: First, by reflection, which is noblest; Second, by imitation, which is easiest; and third by experience, which is the bitterest."           -Confucius

      Sorry, new here, I used the print statements from the previous posters suggestions. The actual data being pushed into the HOA is a lot of code and is an AD query so it wouldn't compile. What I end up with is a key of Bob and an array containing groups: domain users, testing, server team etc
      push (@{$newgrouphash{"$newdn"} },"$newgroup"); foreach $newdn (sort keys %newgrouphash ) { print "Name:$newdn\n\t"; foreach $group ( sort @{$newgrouphash{$newdn}} ) { + if (!($group =~ /CN=Domain Users/i)) { # print "$group, "; + $res = `dsmod group $group -rmmbr \"$newdn\"`; + print "$res\n";
Re: Hash of arrays
by 7stud (Deacon) on Dec 28, 2012 at 10:01 UTC

    The actual data being pushed into the HOA is a lot of code and is an AD query so it wouldn't compile

    And that is the setting you chose to learn how to use HOA's? Try this instead: post some code that builds an HOA from the data in a file, and then prints out all the keys and their values. Post the file and your code.

      Thanks, I was using %newgrouphash = undefined; to declare my hash instead of %newgrouphash = (); That is where the extra key was coming from. forever learning - thanks for the help
        If you had
        use strict; use warnings;
        at the top of your code, it would have pointed out your problem, with the message:
        Use of uninitialized value in list assignment at ..
        (This comes from 'use warnings;')

        There is overwhelming agreement here that those two directives should be at the top of EVERY script you write, and you have just experienced an instance where it could have saved days of questioning and struggle.

                     "By three methods we may learn wisdom: First, by reflection, which is noblest; Second, by imitation, which is easiest; and third by experience, which is the bitterest."           -Confucius

Re: Hash of arrays
by Anonymous Monk on Dec 28, 2012 at 14:00 UTC
    Most of the time you use hash references, each element of which in this case would contain an array reference. A reference is "a single thing" i.e. "a scalar," yet it can "refer to" anything at all. Perl syntax is flexible and makes it easy to write that.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1010633]
Approved by NetWallah
Front-paged by NetWallah
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (3)
As of 2014-09-20 21:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (163 votes), past polls