http://www.perlmonks.org?node_id=568599


in reply to How do I get only one item out of attribute?

The easiest way is to use a regular expression.
my $dn = 'corpid=xxxxxx,ou=people,o=corp'; my ($ou) = $dn =~ /ou=([^,]*)/; print "ou = $ou\n";
You could also create a hash of the tokens like this if you need to test other values:
my $dn = 'corpid=xxxxxx,ou=people,o=corp'; my %tokens = map {split /=/} split /,/, $dn; print "ou = $tokens{ou}\n";
This approach first splits the $dn variable into pairs of this form:
  corpid=xxxxxx
  ou=people
  o=corp
It then splits each of those pairs by the '=', which results in this list:
  corpid,
  xxxxxx,
  ou,
  people,
  o,
  corp
Which is equivalent to defining a hash like this:
my %tokens = ( corpid => 'xxxxxx', ou => 'people', o => 'corp', );

Replies are listed 'Best First'.
Re^2: How do I get only one item out of attribute?
by izut (Chaplain) on Aug 21, 2006 at 17:18 UTC

    Another hint is use the following, which I think is more readable :-)

    my $dn = 'corpid=xxxxxx,ou=people,o=corp'; my ($ou) = $dn =~ /ou=(.*?),/; print "ou = $ou\n";

    From perldoc perlre:

    Sometimes minimal matching can help a lot. Imagine you’d like +to match everything between "foo" and "bar". Initially, you write somet +hing like this: $_ = "The food is under the bar in the barn."; if ( /foo(.*)bar/ ) { print "got <$1>\n"; } Which perhaps unexpectedly yields: got <d is under the bar in the > That’s because ".*" was greedy, so you get everything between t +he first "foo" and the last "bar". Here it’s more effective to use mini +mal matching to make sure you get the text between a "foo" and the +first "bar" thereafter. if ( /foo(.*?)bar/ ) { print "got <$1>\n" } got <d is under the >

    Igor 'izut' Sutton
    your code, your rules.