in reply to ldap search question

Do you want to limit by $var ( element of @attrs) or by $value (element of @$attr)?

Here is an example with 3 extra lines compare to yours that only prints givenname and department, assuming that those are of the latter form, limiting to values of $value

# configuration: Put the fields you want here. my @fields_i_want_to_see= qw(givenname department); my %show_field = map { $_ => 1 } @fields_i_want_to_see; use Net::LDAP; $ldap = Net::LDAP->new('ldap.acme.com') or die "$@"; $mesg = $ldap->search( base => "o=acme.com", scope => 'sub', filter => "sn=smith", ); # # At this point the user can get the returned data # as an array or as a stack. # In this example we will use an array # How many entries were returned from the search my $max = $mesg->count; for( my $index = 0 ; $index < $max ; $index++) { my $entry = $mesg->entry($index); my $dn = $entry->dn; # Obtain DN of this entry @attrs = $entry->attributes; # Obtain attributes for this entry. foreach my $var (@attrs) { #get a list of values for a given attribute $attr = $entry->get_value( $var, asref => 1 ); if ( defined($attr) ) { foreach my $value ( @$attr ) { print "$var: $value\n" if $show_field{$var};# Print each val +ue for the attribute. } } + } }

Replies are listed 'Best First'.
Re^2: ldap search question
by csarid (Sexton) on Jul 21, 2009 at 21:53 UTC
    spazm,

    Thanks very much for the very useful lines you added. This is exactly what I was looking for, but did not know how to formulate. This is very clean and very efficient for my needs.

    Also, thanks to all who reaponded, I appreciate your answers as well.

    Thanks again for all the help everyone!
Re^2: ldap search Follow-up question
by csarid (Sexton) on Jul 24, 2009 at 19:41 UTC

    Now that I can pull the givenname and department, if I were to want to pull a list of "sn" in my search criteria(such as "smith, jones, peters"), the print statement which checks if the values are one of "surname or department" would continously print all values for "smith, jones, and peters".

    I my case I would like to generate a list I can then be parsed pulling the "surname and deapartment" to do something with this.
    For example:

    currently it would print:
    "SmithY100JonesZ300PetersXL200"

    What I would like to be able to do is have an output like: "SmithY100:JonesZ300:PetersXL200"

    Being able to group the information for each name/department. I can throw this into a messy array, but I'm hoping there some suggestions I can learn from and do this more efficiently.

    # configuration: Put the fields you want here. my @fields_i_want_to_see= qw(givenname department); my %show_field = map { $_ => 1 } @fields_i_want_to_see; use Net::LDAP; $ldap = Net::LDAP->new('ldap.acme.com') or die "$@"; $mesg = $ldap->search( base => "o=acme.com", scope => 'sub', filter => "sn=smith", ); # # At this point the user can get the returned data # as an array or as a stack. # In this example we will use an array # How many entries were returned from the search my $max = $mesg->count; for( my $index = 0 ; $index < $max ; $index++) { my $entry = $mesg->entry($index); my $dn = $entry->dn; # Obtain DN of this entry @attrs = $entry->attributes; # Obtain attributes for this entry. foreach my $var (@attrs) { #get a list of values for a given attribute $attr = $entry->get_value( $var, asref => 1 ); if ( defined($attr) ) { foreach my $value ( @$attr ) { # I'd like to be able to check when the we're past the last +entry we're looking for, for each "smith, jones, and peters" + print "$var: $value\n" if $show_field{$var};# Print each val +ue for the attribute. } } + } }