Wesley Phillips wrote:
> Hi all,
>   I have been working on a problem and worked out a solution, but am
> wondering if there is an easier(more elegant?) way of doing it. I am
> automatically generating configuration files for a Quality Of Service(QOS)
> device, and each pipe in the QOS has a policy number attached to it. The
> policy numbers must be unique, so I have to find an unused number. The
> system never has more than 200 or so policies. I am pulling the preexisting
> policy numbers out of a database and placing them into an array(@addarr)
> Here is my code:
>
>
> #!/usr/bin/perl
>
> use Mysql;
>
> $db = Mysql->connect('localhost', 'dbase', 'user', 'password');
> $query = $db->query("SELECT policy FROM Table");
> while ( $policy = $query->fetchrow_array()) {
>   $addarr[$policy] = $policy;
> }
> for ($i = 1; $i < 1001; $i++) {
>   if (defined($addarr[$i])) {
>     next;
>   } else {
>     $newaddr = $i;
>     last;
>   }
> }
>
> where $newaddr would be the new, as yet unused, number

Hi Wes.

First of all,

  use strict;   # always
  use warnings  # usually

Secondly the Mysql module is now deprecated in favour of DBI together with
its DBD::mysql driver.

However I can well believe that either or both of these points are dictated
by your employer, so here's the answer...

It looks like you want the smallest number in 1 .. 1000 which doesn't already
exist in the 'policy' column of 'Table'. What I'd do is to start by setting
up a hash with all of the valid values as keys. Then simply drag in all of
the current values of this column into an array and use it to delete the
corresponding elements of the hash. The number you want is then the first
of the sorted list of remaining hash keys. It looks like this:

  use strict;
  use warnings;

  use Mysql;

  my $db = Mysql->connect('localhost', 'dbase', 'user', 'password');

  # Set up the hash with 1000 elements
  #
  my %policy;
  @policy{1 .. 1000} = ();

  # Delete all those currently in use
  #
  my @current = $db->query("SELECT policy FROM Table")->fetchcol;
  delete @[EMAIL PROTECTED];

  # The next one to use is the first of those left
  #
  my $next = (sort keys %policy)[0];


HTH,

Rob




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

Reply via email to