open (FH, $filename) or die ... local $/ = "\n\n"; # read objects, not lines while () { chomp($_); # remove \n\n at the end of the object s/\n //g; # care for continuation lines, e.g. kill them my @tmpLines = split(/\n\n/, $_); my %data = (); foreach my $line (@tmpLines) { my ($attr, $value) = split(/\s*=\s*/, $line, 2); # do something with $attr and $value, e.g. push (@{ $data{$attr} }, $value); } # foreach # e.g. extract first uid as dn my $dn = shift( @{ $data{uid} } ); print "dn: $dn\n"; foreach my $attr (keys %data) { foreach my $value (@{ $data{$key} }) { # perhaps you should care to create continuation lines # or better write the ldif with Net::LDAP::LDIF print "$attr: $value\n"; } } print "\n"; # object separator } # while close (FH);