Thanks everybody...here is the final code I crafted from my original
and your suggestions.

#!/usr/bin/perl
use warnings;
use strict;

my $ca_path = "log_ca.txt";
my $aa_path = "log_aa.txt";


my %final_report;
my @ca_filenames;
my @aa_filenames;


open (CAFILE, $ca_path) or die $!;
my @ca_files = <CAFILE>;

open(AAFILE, $aa_path) or die $!;
my @aa_files = <AAFILE>;


#sort arrays
my @ca_files_sorted = sort @ca_files;
my @aa_files_sorted = sort @aa_files;

my $total_items = @ca_files_sorted;

foreach(@ca_files_sorted){
     s/\s+\z//;  # Remove all trailing whitespace
     push @ca_filenames, /\d+->(.+)/;
}



foreach(@aa_files_sorted){
         s/\s+\z//;  # Remove all trailing whitespace
     push @aa_filenames, /\d+->(.+)/;
}

for (1..$total_items){
        $final_report{ pop @ca_filenames } = pop @aa_filenames;
}



print "CA FILENAME => AA_FILENAME\n";
print '-' x 27, "\n";
foreach (sort { $a cmp $b } keys(%final_report) ){
    print "$_ => $final_report{$_}\n";
}


Now it prints the output just fine.

Thanks again.


On Apr 24, 2:12 am, [EMAIL PROTECTED] (John W. Krahn) wrote:
> icarus wrote:
> > I have two files: log_ca.txt and log_aa.txt
> > contents of log_ca.txt:
>
> > 333333333->ca_filename3
> > 444444444->ca_filename4
> > 111111111->ca_filename1
> > 222222222->ca_filename2
>
> > contents of log_aa.txt:
>
> > 111111111->aa_filename1
> > 333333333->aa_filename3
> > 222222222->aa_filename2
> > 444444444->aa_filename4
>
> > The program extracts the values after the -> delimiter of both files
> > Makes an association between the values on both of the files.
>
> > Meaning, this is desired output:
>
> > CA FILENAME => AA_FILENAME
> > ---------------------------
> > ca_filename1 => aa_filename1
> > ca_filename2 => aa_filename2
> > ca_filename3 => aa_filename3
> > ca_filename4 => aa_filename4
>
> > Outputs I'm getting
> > (see "double pop" in code below for details)
>
> > CA FILENAME => AA_FILENAME
> > ---------------------------
> >  =>
> > ca_filename3 => aa_filename3
> > ca_filename4 => aa_filename4
>
> > and
>
> > (after adding the "double pop" below prints all records but still get
> > the => delimiter)
> > CA FILENAME => AA_FILENAME
> > ---------------------------
> >  =>
> > ca_filename1 => aa_filename1
> > ca_filename2 => aa_filename2
> > ca_filename3 => aa_filename3
> > ca_filename4 => aa_filename4
>
> > Questions:
> > How do I get the desired output without resorting to the 'double pop'?
> > How do I get rid of the extra "=>"?
>
> > Thanks in advance.
>
> > #!/usr/bin/perl
> > use warnings;
> > use strict;
>
> > my $ca_path = "log_ca.txt";
> > my $aa_path = "log_aa.txt";
>
> > my %final_report;
> > my @ca_filenames;
> > my @aa_filenames;
>
> > open (CAFILE, $ca_path) or die $!;
> > my @ca_files = <CAFILE>;
>
> > open(AAFILE, $aa_path) or die $!;
> > my @aa_files = <AAFILE>;
>
> > #sort arrays
> > my @ca_files_sorted = sort @ca_files;
> > my @aa_files_sorted = sort @aa_files;
>
> > my $total_items = @ca_files_sorted;
>
> > foreach(@ca_files_sorted){
> >    s/[\r\t\n]+//; #Remove carriage returns and new lines
> >    my @temp = split (/\d+->/, $_);
>
> Assuming that $_ contains '111111111->ca_filename1' then @temp now
> contains ( '', 'ca_filename1' ).
>
> >    push @ca_filenames, @temp;
> > }
>
> At the end of the loop @ca_filenames will contain:
>
> ( '', 'ca_filename1', '', 'ca_filename2', '', 'ca_filename3', '',
> 'ca_filename4' )
>
> You need to store only the string after /\d+->/:
>
> foreach ( @ca_files_sorted ) {
>      s/\s+\z//;  # Remove all trailing whitespace
>      push @ca_filenames, /\d+->(.+)/;
>
> }
> > foreach(@aa_files_sorted){
> >    s/[\r\t\n]+//; #Remove carriage returns and new lines
> >    my @temp = split (/\d+->/, $_);
> >    push @aa_filenames, @temp;
> > }
>
> As above, at the end of the loop @aa_filenames will contain:
>
> ( '', 'aa_filename1', '', 'aa_filename2', '', 'aa_filename3', '',
> 'aa_filename4' )
>
> > ###problems start here
> > #why do I need to put [EMAIL PROTECTED] twice?
>
> Because @ca_filenames has twice as many elements as @ca_files_sorted
> (where $total_items was derived from.)
>
> > #otherwise it won't display all items.
> > #I don't put that this is the outcome.
> > #CA FILENAME => AA_FILENAME
> > # =>
> > #ca_filename3 => aa_filename3
> > #ca_filename4 => aa_filename4
>
> > for (1..$total_items){
> >    $final_report{ pop @ca_filenames } = pop @aa_filenames;
> >    $final_report{ pop @ca_filenames } = pop @aa_filenames;
> > }
>
> And so you end up with a hash that has a key '' and a corresponding
> value ''.
>
> You could accomplish the same thing more simply with a hash slice (no
> loop required):
>
> @final_report{ @ca_filenames } = @aa_filenames;
>
> > #why do I get the '=>' symbol there?
> > print "CA FILENAME => AA_FILENAME\n";
> > foreach (sort { $a cmp $b } keys(%final_report) ){
> >     print "$_ => $final_report{$_}\n";
> > }
>
> John
> --
> Perl isn't a toolbox, but a small machine shop where you
> can special-order certain sorts of tools at low cost and
> in short order.                            -- Larry Wall


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to