Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

sort using <=>

by drock (Beadle)
on Aug 13, 2004 at 18:10 UTC ( #382783=perlquestion: print w/replies, xml ) Need Help??

drock has asked for the wisdom of the Perl Monks concerning the following question:

People of the Perl,
I have tried this code with no errors, but it is not giving me any results. My data file has 3 fileds and I am trying to sort the 3rd field, here is the data file:
05/06/04 11:01:32 E00833 05/06/04 11:01:32 E00545 05/06/04 11:01:32 E00820 05/06/04 11:01:32 E00610 05/06/04 11:01:32 E00333 05/06/04 11:01:32 E01099 05/06/04 11:01:32 E00213 05/06/04 11:01:32 E00612
Below is my code:
snippett...snippett open (FOO, ">$scratches") || die "could not open file:$!"; open (D, "$logf") || die "could not open file:$!"; while (<D>) { ## look for 9840S and ebexpire ## declare OFS = tab ## tell split to split on IRS 0, + 1 & 5. Very similar to awk print $ if (($_ =~ /9840S/) && ($_ =~ /ebexpire, ebexpire/ )) +{ local $, = "\t"; print +(split)[0,1,5], $/; } # end if } # end while foreach (<D>) { print FOO (sort { $a <=> $b } $_ ) } close (FOO); close (D);
My out file is zero bytes! Help!

janitored by ybiC: Balanced <code> tags around sample data, as per consideration

Replies are listed 'Best First'.
Re: sort using <=>
by Happy-the-monk (Canon) on Aug 13, 2004 at 18:29 UTC

    } # end while

    seek(D, 0,0); # add this to rewind <D> before reusing it.

    foreach (<D>) {

    Maybe rethink if you need a while loop first and a foreach loop next?
    What do you expect the sort to do actually?


    The solution to get the ... splitted in the second print line is simply to use split there too:

    print F00 +(split)[0,1,5], $/;
    print FOO (sort { $a <=> $b } +(split /\s+/, $_)[0,1,5] );

    Cheers, Sören

      I am rethinking whether I need the while and foreach so I have changed it to :
      open (FOO, ">$scratches") || die "could not open file:$!"; open (D, "$logf") || die "could not open file:$!"; while (<D>) { ## look for 9840S and ebexpire ## declare OFS = tab ## tell split to split on IRS 0, 1 & 5. Very similar t +o awk print $ if (($_ =~ /9840S/) && ($_ =~ /ebexpire, ebexpire/ )) +{ local $, = "\t"; print F00 +(split)[0,1,5], $/; print FOO (sort { $a <=> $b } $_ ); } # end if } # end while close (FOO); close (D);
      I am probably making this too hard, but I want to numerically sort the 3rd field. How do I combine the print FOO statements so that I am still spliting fields 0,1,5 while sorting on field 5? thank you,
        Looks to me like you want something like this Schwartzian Transform:
        #open your files as before, then print FOO map { $_->[1] } sort { $a->[0] <=> $b->[0] } map {my @F=split; [substr($F[2],1), $_]} <D>; #close your files as before
        Reading from bottom to top, we construct an array of arrays, where the first element of each element is the sort-field, and the second is the print-field. Then we sort by comparing the sort fields, then we return only the print-fields to print.

        Updated to work on the data provided.

        Caution: Contents may have been coded under pressure.
Re: sort using <=>
by VSarkiss (Monsignor) on Aug 13, 2004 at 18:35 UTC

    Are you wondering why the second loop (the foreach) isn't doing anything? It's because you only come out of the while loop above it after reading everything out of the D filehandle, so the foreach over the same handle will never enter the block.

    I'm not sure exactly what you're trying to do, so I'm not sure how to tell you to fix it. But that's the reason you're not getting anything written to FOO.

Re: sort using <=>
by Plankton (Vicar) on Aug 13, 2004 at 18:13 UTC

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://382783]
Approved by Plankton
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (1)
As of 2023-06-03 04:08 GMT
Find Nodes?
    Voting Booth?
    How often do you go to conferences?

    Results (6 votes). Check out past polls.