in reply to Reading Text File into Hash to Parse and Sort

Nothing in your post uses hashes, so we can't even imagine what kinds of problems you are having. But let's assume you want a hash to the different columns of each row. You ultimately want an array of hashes, one array element for each line in the file, each array element a hash with the columns.

#!/usr/bin/perl use strict; use warnings; my @columns = qw/Date ClosingPrice AveragePrice/; my (@lines,@array); open (FILE, '<', 'FB_LPWAP.txt') or die ("ERROR: Could not read file") +; foreach my $line (<FILE>){ push @array, do { my %h; @h{@columns} = split /\t/,$line; \%h }; } close (FILE); foreach my $row (@array) { foreach my $col (reverse keys %{$row}) { printf "%s=>%s ",$col,$row->{$col} } print "\n"; }

Update #1 - thanks to tye for the hash slice solution. Update #2 - by the time I figured all this out, there were already better solutions. Hope I learned something ...

Dum Spiro Spero

Replies are listed 'Best First'.
Re^2: Reading Text File into Hash to Parse and Sort
by Perl_Derek (Initiate) on Apr 22, 2015 at 16:29 UTC

    Thank you for all of the great feedback. It will help in my understanding of Perl to see how the Monks work through problems.

    The example code I provided worked for me. It allowed me to parse data from a text file using arrays, but I am trying to do this on a larger scale with a new file with hashes.

    Ultimately, I am trying to learn how to create a hash to sort data by a specific column from a text file. I would also like to learn how to parse data from a text file using hashes.

    I don't know how to reference all columns from a text file using hashes and then isolate one specific column to sort or parse. This is one of many knowledge gaps for me.

    There is nothing in the books or posts I have read which shows me how to do this. It seems to be a pretty basic, but I just can't find this information.

    I am just getting started with Perl, so I will go back to the books and come back with more well-organized questions in the future.

    Thank you for your time and all of your responses.

      I am trying to do this on a larger scale with a new file with hashes.

      Ultimately, I am trying to learn how to create a hash to sort data by a specific column from a text file. I would also like to learn how to parse data from a text file using hashes.

      Tux has already pointed out the better tool: Text::CSV. It will handle all of the details people forget about when dealing with delimited files like what you have. Assuming the first line of the file has a list of column names, you'll end up with something like:
      use strict; use warnings; use Text::CSV; # I had to specify "XS" in the use line and in the call to new, below #use Text::CSV_XS; open my $fh, '<', 'filename.txt' or die "Cannot open filename.txt: $!\n"; my $parser = Text::CSV->new({ sep_char => '|' }); $parser->column_names($parser->getline($fh)); # $parser->getline_hr_all() returns a reference to an array; # which is easy enough to use, but the @{...} syntax unpacks # it to an array, which you might find convenient my @rows = @{$parser->getline_hr_all($fh)}; close $fh; # sort can take a block of code to specify how things should # be sorted, which in your case would be "by which columns" # use cmp for string sort; <=> for numeric sort, and # Unicode::Collate ( https://metacpan.org/pod/Unicode::Collate ) # for anything complex for my $row (sort { $a->{col_name} cmp $b->{col_name} } @rows) { ... } for my $row (sort { $a->{number} <=> $b->{number} } @rows) { ... }