Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Re^2: Sort log file alphabetically

by numberninja (Initiate)
on Jul 28, 2008 at 15:49 UTC ( [id://700578]=note: print w/replies, xml ) Need Help??


in reply to Re: Sort log file alphabetically
in thread Sort log file alphabetically

thanks, the stuff u posted seems to work fine, as it prints out an alphabetized list of all the different names when i add a print command to the end. However, how would i tell perl to rearrange each line according to this order? especially since i need to make sure the correct data stays with the identifier

Replies are listed 'Best First'.
Re^3: Sort log file alphabetically
by pc88mxer (Vicar) on Jul 28, 2008 at 16:06 UTC
    You don't have to worry about the data staying with the identifier since that association is saved in the hash for the line.

    Re-formatting the lines is just looping over @list:

    my @keys = ...order you want the named keys in... for my $h (@list) { print join(",", $h->{first}, $h->{date}, map { $_." ".$h->{$_} } @keys), "\n"; }
      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"; } }
        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: $!";

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://700578]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (10)
As of 2024-04-18 09:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found