Perl For循环建议
我有一个字段,取值范围从0到60000 对于该字段,数据库中的值为5,6,7,8,45,91,92,93,94 我必须得到这个领域的免费值和使用值建议 1.已使用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
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谢谢你的测试,修好了。