Thanks for the quick response.  I think what you've described is a bit 
over my head. But, I'll try it and see what happens.

The files will always be, env-yyyymmdd-nn and will get rotated at months 
end. However, your solution much more flexible.

Thanks again,

gS


On Wednesday, July 18, 2001, at 05:33 PM, Jeff 'japhy/Marillion' Pinyan 
wrote:

> On Jul 18, Groove Salad said:
>
>> checking: env-20010712-0
>> checking: env-20010712-1
>> checking: env-20010712-10
>> checking: env-20010712-11
>> checking: env-20010712-12
> [snip]
>> checking: env-20010712-7
>> checking: env-20010712-8
>> checking: env-20010712-9
>>
>> How can I get them in numerical order? I tried to sort them in my 
>> script
>> with the following <snip>, but, it's not what I was hoping for.
>
> Your problem is three-fold:
>
>   1. ignore the "env-" prefix
>   2. sort by the major number
>   3. OR sort by the minor number (ignoring the "-" infix)
>
> I suggest using a Guttman-Rosler transform.  This is three-part:
>
>   1. normalize your data
>   2. sort it natively
>   3. retrieve original data
>
> For your purposes, I suggest a normalize that turns
>
>   env-YYYYMMDD-NNN
>
> into the number
>
>   YYYYMMDDNNN
>
> where NNN is padded with 0's on the left to make it 3 digits.
>
>   sub normalize {
>     my $file = shift;
>     $file =~ s/^env-//;
>     $file =~ s/-(\d+)/sprintf "%03d", $1/;
>     return $file;
>   }
>
> The retrieval function is just the opposite.
>
>   sub retrieve {
>     my $num = shift;
>     $num =~ s/(\d\d\d)$//;
>     (my $minor = $1) =~ s/^0+(?!$)//;
>     return "env-$num-$minor";
>   }
>
> There's a small trick to my $minor variable there.  The number is
> something like 20010717025.  It represents the file env-20010717-25.  
> But
> the number 20010717000 represents env-20010717-0.  So we need to strip
> LEADING 0's from the minor number, but not ALL of them.  The regex
>
>   s/^0+(!$)//
>
> means to remove one or more leading 0's, that are NOT followed by the 
> end
> of the string.  This constraint means that only the first two 0's from
> "000" will be removed -- if the third were removed, it would be followed
> by the end of the string, and the regex would fail.
>
> Now that we have our two functions, we are ready:
>
>   my @sorted =
>     map retrieve($_),
>     sort
>     map normalize($_),
>     @original;
>
> That is read bottom to top -- first, we normalize the filenames, then we
> sort them natively (meaning, we use Perl's standard (fast) sorting), and
> then we retrieve the filenames.
>
> --
> Jeff "japhy" Pinyan      [EMAIL PROTECTED]      
> http://www.pobox.com/~japhy/
> I am Marillion, the wielder of Ringril, known as Hesinaur, the 
> Winter-Sun.
> Are you a Monk?  http://www.perlmonks.com/     
> http://forums.perlguru.com/
> Perl Programmer at RiskMetrics Group, Inc.     
> http://www.riskmetrics.com/
> Acacia Fraternity, Rensselaer Chapter.         Brother #734
> **      Manning Publications, Co, is publishing my Perl Regex 
> book      **
>


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to