my @keys = ...order you want the named keys in...
for my $h (@list) {
print join(",", $h->{first}, $h->{date},
map { $_." ".$h->{$_} } @keys), "\n";
}
| [reply] [d/l] [select] |
u were right about that, silly me
and yet, now i have an incredibly trivial problem. For some reason, when i leave it as printing to the command window, it spews out the exact stuff that i want, yet when i tell it to print to a filehandle, the file is empty afterwards...
here's my code:
#! /usr/bin/perl
print "File Location?";
my $data_file = <>;
open(DATA, $data_file);
my @list;
while (<DATA>) {
chomp;
my (%hash, @rest);
($hash{first}, $hash{date}, @rest) = split(",", $_);
for my $r (@rest) {
my ($k, $v) = split(' ', $r, 2);
$hash{$k} = $v;
}
push(@list, \%hash);
};
my %seen;
for (@list) { for (keys %$_) { $seen{$_}++ } };
delete $seen{first};
delete $seen{date};
my @allkeys = ('first', 'date', sort keys %seen);
my @keys = (sort keys %seen);
open(DATAOUT, ">1.temp");
while(<DATAOUT>) {
for my $h (@list) {
print DATAOUT join(",", $h->{first}, $h->{date},
map { $_." ".$h->{$_} } @keys), "\n";
}
}
| [reply] [d/l] |
while(<DATAOUT>) {
attempts to read from DATAOUT, which you just opened for writing only. As a result, the test (successful read from DATAOUT) fails and the body of your while is not executed. If you had use warnings;, you would have been told that DATAOUT was open only for output.
You don't need that while loop, the for loop will do the job you want done.
You should always
use strict;
use warnings;
It's also a GoodIdea to
open(FH, ....) or die "error opening FH: $!";
| [reply] [d/l] [select] |