use warnings; use strict; use diagnostics; my $database = "Database.txt"; my $part_number_range = 10; open (my $input, "<" , $database) || die "Can't open $database: $!"; my %part_numbers = map { chomp; $_=>1 } <$input>; close $input; use Data::Dumper; print Dumper(\%part_numbers); # DEBUG my $new_part_number; my $bail_out_count; while (1) { $new_part_number = sprintf("%07d", int(rand($part_number_range))); last unless exists $part_numbers{$new_part_number}; die "Bailing out after too many retries" if ++$bail_out_count>1000; print "Collision with part number '$new_part_number', retrying\n"; # DEBUG } print "Chose part number: '$new_part_number'\n"; # DEBUG open (my $output, ">>" , $database) || die "Can't open $database: $!"; print $output "$new_part_number\n"; close $output;