in reply to Re^6: Perl Builds an LDIF
in thread Perl Builds an LDIF

In addition to Corion's wise words,

Your code:

if ( $result != /dn:/ )
probably does not do what you think it does - and I'm curious to know what you think it does.
That is probably why you are puzzled about the contents out OUT.

You probably want to see if $entry contains "dn" and negate that:

if ( $entry !~ /dn:/ )

     Syntactic sugar causes cancer of the semicolon.        --Alan Perlis

Replies are listed 'Best First'.
Re^8: Perl Builds an LDIF
by rfransix (Novice) on Jun 17, 2010 at 20:01 UTC

    Temporarily, I am working on different code to achieve the same result. So I may better understand Perl, I submit the following code, albeit not working. I gratefully await your expertise on why it does not work. Grateful for your expertise. This code erractically outputs to OUT. Where should chomp; go in this example? Both PERSON and MGR have an equal number of lines. The desired result is:

    line1 from PERSON changetype: modify replace: manager line1 from MGR line2 from PERSON changetype: modify replace: manager line2 from MGR ...etc... #! perl -slw use strict; use warnings; use diagnostics; use constant batchdir => "c:\temp10"; open (PERSON,"f1"); open (MGR,"f2"); open OUT, ">", "buildAD.ldif" or die "Cannot write to 'buildAD.ldif': +$!"; truncate (OUT, 0); my $line; my $line2; while ($line = <PERSON>) { #chomp; my @dn1 = split(/\s+/,$line); my $count = scalar(@dn1); print OUT "$line"; print OUT "changetype: modify"; print OUT "replace: manager"; while ($line2 = <MGR>) { #chomp; my @dn2 = split(/\s+/,$line2); my $count2 = scalar(@dn2); print OUT $line2, "\n", if ($count == $count2); } } close PERSON; close MGR; close OUT; exit;

    Example data in OUT is here, the extra newline on line 2 should not be there, and all the numbers after 2821 are from <MGR>.

    0104 changetype: modify replace: manager 2821 3682 1129 2050 4054 0755
Re^8: Perl Builds an LDIF
by rfransix (Novice) on Jun 17, 2010 at 20:15 UTC

    Much closer, I've written the following code, albeit also not working, with the same intent. The issue here is that, see OUT example below, only the first line of <PERSON> is read; instead of line1 from <PERSON>, then line1 from <MGR>, then line2 from <PERSON>, then line2 <MGR>, etc.

    while (<PERSON>) { chomp; my $input1 = $_; while (<MGR>) { chomp; my $input2 = $_; print OUT $input1; print OUT "changetype: modify"; print OUT "replace: manager"; print OUT $input2, "\n"; } } exit;

    Output from OUT

    0479 changetype: modify replace: manager 4410 0479 changetype: modify replace: manager 8050 0479 changetype: modify replace: manager 0650 0479 changetype: modify replace: manager 7030 0479 changetype: modify replace: manager 9857 0479 changetype: modify replace: manager 4380
      You are, once again, nesting loops when you do not intend to.

      For better control of loops, separate the "loop" part from "Read input" for "MGR":

      while (defined my $input1=<PERSON>) { my $input2 = <MGR> or die "No corresponding MGR for $input1"; chomp $input1; # Are you sure you want to chomp ? If so, you probably need \n + when printing chomp $input2; print OUT $input1; print OUT "changetype: modify"; print OUT "replace: manager"; print OUT $input2, "\n"; }

           Syntactic sugar causes cancer of the semicolon.        --Alan Perlis

        Grateful for your guidance, I submit the following error based on your coding, please advise.

        Can't modify defined operator in scalar assignment at build4c22.pl line 12, near "<PERSON>) " Execution of build4c22.pl aborted due to compilation errors (#1) (F) You aren't allowed to assign to the item indicated, or otherwise try to change it, such as with an auto-increment. BEGIN not safe after errors--compilation aborted at c:/Perl/lib/Carp/Heavy.pm line 11. Compilation failed in require at c:/Perl/lib/Carp.pm line 33.

        #! perl use strict; use warnings; use diagnostics; open PERSON, "<", "ou3" or die "Cannot read 'ou3': $!"; open MGR, "<", "ou8" or die "Cannot read 'ou8': $!"; open OUT, ">", "buildAD.ldif" or die "Cannot write to 'buildAD.ldif': +$!"; truncate (OUT, 0); while (defined my $input1 = <PERSON>) { my $input2 = <MGR> or die "No file MGR for $input1"; chomp $input1; chomp $input2; print OUT $input1; print OUT "changetype: modify"; print OUT "replace: manager"; print OUT $input2, "\n"; } close PERSON; close MGR; close OUT; exit;