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 pop@... 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
Thread Previous
|
Thread Next