Perl For循环建议

Perl For循环建议,perl,Perl,我有一个字段,取值范围从0到60000 对于该字段,数据库中的值为5,6,7,8,45,91,92,93,94 我必须得到这个领域的免费值和使用值建议 1.已使用 Minvalue=0 maxvalue=94(来自数据库) 我使用for循环(i=minvalue;i如果数据库表有N行,则0和N之间(包括0和N)的值中至少有一个必须未使用,因此最多只需循环N+1次 在Perl中实现这一点的一种有效方法是将使用的值存储为散列键,然后在循环中增加一个变量,直到它不再匹配散列中的任何键: my @val

我有一个字段,取值范围从0到60000

对于该字段,数据库中的值为5,6,7,8,45,91,92,93,94

我必须得到这个领域的免费值和使用值建议

1.已使用
Minvalue=0 maxvalue=94(来自数据库)

我使用for循环(i=minvalue;i如果数据库表有N行,则0和N之间(包括0和N)的值中至少有一个必须未使用,因此最多只需循环N+1次

在Perl中实现这一点的一种有效方法是将使用的值存储为散列键,然后在循环中增加一个变量,直到它不再匹配散列中的任何键:

my @values = (5,6,7,8,45,91,92,93,94);

my %hash;
undef @hash{@values};

my $x = 0;
$x++ while exists $hash{$x};

# now $x is the lowest unused value
不要那样做

如果可能,将此数据库列设置为
自动增量
(或您的SQL引擎最接近的替代项),以便自动分配新值。如果不可能,您可以改为
从表
中选择MAX(col)+1以确定下一个可用值(但请注意,这是容易争用的)

在任何一种情况下,都不要担心留下缺口。在大多数应用程序中,这不是问题。如果应用程序中存在域需求,而您的ID数量有限(为什么?)


如果您处于一种非常不寻常的情况,即您有少量需要有效分配的可用值,那么您应该显式地跟踪这些值。创建一个表,每个可用值对应一行,并有一个字段指示分配给哪些值,然后使用类似
SELECT id FROM id的内容搜索该表_表,其中inuse=0 LIMIT 1

无需循环遍历特定范围内的所有值。只需遍历您的值并分别查找连续值(例如当前值比前一个值大一个)或间隙。这样会更快

打印使用的范围

my @values = (5, 6, 7, 8, 45, 91, 92, 93, 94);
my $start = shift @values;
my $i = $start;
for my $v (@values) {
    if ($v > $i + 1) {
        if ($i == $start) {
            print "$start\n";
        } else {
            print "$start to $i\n";
        }

        $start = $v;
    }

    $i = $v;
}

if ($i == $start) {
    print "$start\n";
} else {
    print "$start to $i\n";
}
并找到自由值的范围

my @values = (5, 6, 7, 8, 45, 91, 92, 93, 94);
my $i = 0;
my $max = 600000;
for my $v (@values) {
    if ($v > $i + 1) {
        print "$i to ", $v - 1, "\n";
    } elsif ($v == $i + 1) {
        print "$i\n";
    }

    $i = $v + 1;
}

if ($i < $max) {
    print "$i to $max\n";
}
my@values=(5,6,7,8,45,91,92,93,94);
我的$i=0;
我的$max=600000;
对于我的$v(@values){
如果($v>$i+1){
打印“$i至”、$v-1、“\n”;
}elsif($v==$i+1){
打印“$i\n”;
}
$i=$v+1;
}
如果($i<$max){
打印“$i到$max\n”;
}

我完全不知道你想问什么。没有线索。我已修复了你的格式,但我认为你需要为问题添加更多细节。显示一些代码。感谢Olaf,我将尝试此操作并让你知道。我当时使用的是哈希映射,没有对输入进行排序。当我找到“my@values=(2,3,4,5,7,8,45,91,92,93,94);“自由范围不显示值6@user1968965谢谢你的测试,修好了。