Kenton Brede wrote:
>
> I've written the following subroutine to snag the next available UID in
> the 700 range from /etc/passwd. I then use the return value with
> "useradd" to add a new user.
>
> The subroutine works fine. If no UID 700 is found it returns 700.
> It then returns the next available UID or adds 1 to the last UID in the 700
> block.
>
> Even though it is functional it seems a little clunky to me. If anyone
> has the time and inclination to point me to changes I could make I
> would appreciate it.
> Thanks,
> Kent
>
> #!/usr/bin/perl
> use warnings;
> use strict;
>
> print get_uid() . "\n";
>
> # Get next available UID in the 700 range
> sub get_uid {
> # Create array populated by UIDs
> my $new_uid ||= '700'; # default to 700 if it doesn't exist.
> my @list;
> while(<DATA>) {
> my @uids = split(/:/);
> if ($uids[2] =~ /^7\d\d$/) {
> push @list, $uids[2];
> }
> }
>
> @list = sort(@list);
>
> # iterate though list snagging the next available UID
> my $num = '700';
> foreach my $i (@list) {
> if ($i > $num) {
> $new_uid = $num;
> last;
> }
> elsif ($i == $num) {
> $new_uid = $num + 1;
> }
> $num++;
> }
> return $new_uid;
> }
>
> __DATA__
> user1:x:700:101:user1:/dev/null:/bin/false
> user2:x:706:101:user2:/dev/null:/bin/false
> user3:x:707:101:user3:/dev/null:/bin/false
> user4:x:708:101:user4:/dev/null:/bin/false
Hi Kenton.
How does this look?
sub get_uid {
my %list;
@list{map {(split /:/)[2]} <DATA>} = ();
return (grep {not exists $list{$_}} 700 .. 799)[0];
}
More readably, this does almost the same thing:
sub get_uid {
my %list;
while(<DATA>) {
my $uid = (split /:/)[2];
$list{$uid}++;
}
foreach my $uid (700 .. 799) {
return $uid unless exists $list{$uid};
}
return undef;
}
HTH,
Rob
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>