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/