in reply to File Sorting Question

Well, a seeker would create a subroutine like this:

@temp = map { s/^The // } @indata; @sorted = sort {lc($a) cmp lc($b) } @temp;
I made a temp array so as not to keep the changes the substitution made.

Update: Actually, it *does not* alter the original values. Note that I assign the map s/// to @temp; @indata remains unchanged. This, from the manpage for map(type it in on this site's search box, for ease).

%hash = map { getkey($_) => $_ } @array; is just a funny way to write %hash = (); foreach $_ (@array) { $hash{getkey($_)} = $_; }

Update (number two): My mistake. . . I did test the code, though I changed it slightly and didn't think to test it again. I'm sorry--I misread the manpage, and misinterpreted what they were doing. This code should do what I meant in the first place:

@temp = map {my $tmp; ($tmp = $_) =~ s/^The //; $tmp} @indata

Replies are listed 'Best First'.
Re: Re: File Sorting Question
by runrig (Abbot) on Jun 19, 2001 at 01:48 UTC
    You'll find that your s/// has changed your original data. And your 'sorted' array no longer has the word 'The'.

    Update:And your map is a 'funny' way to write (thanks for pointing out another bug :-):

    for (@array) { my $num = s/^The //; push @temp, $num; }
    which DOES modify the original @array. And doesn't put the desired value into @temp ($num is the number of substitutions, which is 0 (undef) or 1).
      s/^The\s+// for @temp= @array;         - tye (but my friends call me "Tye")
Re: Re: File Sorting Question
by chipmunk (Parson) on Jun 19, 2001 at 02:11 UTC
    Yes, it does modify the original values, because the assignment to @temp occurs after the map, and after $_ has been changed in place for each element of @indata.

    Furthermore, substitution returns true or false; it does not return the modified string. Therefore, @temp will be a list of null strings and 1s, and @sorted will be a sorted list of null strings and 1s.

    Please test your code before posting it, or at least before contradicting a helpful correction from another Perl Monk.

    #!/usr/local/bin/perl -w $, = "\n"; chomp(@indata = <DATA>); @temp = map { s/^The // } @indata; @sorted = sort {lc($a) cmp lc($b) } @temp; print @indata, "---", @temp, "---", @sorted, "---\n"; __DATA__ The Dog A Bird The Cat Lots of Fish
    And the output:
    Dog A Bird Cat Lots of Fish --- 1 1 --- 1 1 ---