macromedia wrote:
> Hi,

Hello,

> I can't seem to get my script to sort properly.

Yes, it is a bit tricky to get right.

> Below is my code along with
> a sample input.txt file. I also have what the output.txt file should look
> like. Also note any duplicate should be striped out 
> which seems to work ok.
> 
> Something is getting messed up when I have the numerials along with alpha
> etc. I can't seem to get the results of the OUTPUT.TXT file below.
> 
> #!/usr/bin/perl -w
> 
> require 5.000;
> 
> use warnings;
> use strict;
> use POSIX;
> 
> my %tags = ();
> 
> my $input = $ARGV[0];
> my $output = $ARGV[1];
> 
> open (FILE, "< $input") or die "cannot open $input: $!\n";
>   while (my $tag = <FILE>) {
>     $tag =~ m/<tag id=(\w+)>/;
>     $tags{$1} = $tag;

You shouldn't use $1 unless you are sure the pattern matched.


>   }
>   open (NEWFILE, "> $output");

You should verify that this file opened correctly too.

   open (NEWFILE, "> $output") or die "cannot open $output: $!\n";


>   foreach my $id ( map { $_->[0] }
>                    sort { $a->[0] cmp $b->[0] || $a->[7] <=> $b->[7] }
>                    map { [ $_, ( isdigit( $_ ) ? $_ : 0 ) ] }
>                    keys %tags )
>   {
>        print NEWFILE $tags{$id};

Missing a closing } here.


This appears to do what you want:


while ( my $tag = <FILE> ) {
    next unless $tag =~ /<tag id=(\d*)([^>]*)>/;
    $tags{ sprintf '%04d%s', $1 || 9999, $2 } = $tag;
    # if you are expecting numbers larger than 9999 then
    # use a larger constant and a larger sprintf format
    }

open (NEWFILE, "> $output") or die "cannot open $output: $!\n";

foreach my $id ( sort keys %tags ) {
    print NEWFILE $tags{ $id };er
    }



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to