develooper Front page | perl.beginners | Postings from April 2008

Re: Properly displaying items from hash

Thread Previous | Thread Next
From:
John W. Krahn
Date:
April 24, 2008 05:42
Subject:
Re: Properly displaying items from hash
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


Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About