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]