如何在perl中检查一个数字是否以其他数字开头
我需要帮助创建一个获取随机数的函数(例如45789277) 并将检查上面的数字是否以一个始终相同的数字列表开始 (例如[1,2,45757,37466]) 如果给定的数字为55366363,列表为[1,4,3],则函数将返回False;如果列表为[6535,55,1,8],则函数将返回True *该数字不可能从列表中的两个数字开始 *给定数字的第一位数字永远不会是0 *列表中有不同长度的数字(一位/两位/三位/四位) *给定的数字总是比列表中的数字多如何在perl中检查一个数字是否以其他数字开头,perl,Perl,我需要帮助创建一个获取随机数的函数(例如45789277) 并将检查上面的数字是否以一个始终相同的数字列表开始 (例如[1,2,45757,37466]) 如果给定的数字为55366363,列表为[1,4,3],则函数将返回False;如果列表为[6535,55,1,8],则函数将返回True *该数字不可能从列表中的两个数字开始 *给定数字的第一位数字永远不会是0 *列表中有不同长度的数字(一位/两位/三位/四位) *给定的数字总是比列表中的数字多 谢谢;) 您可以将所有前缀合并到一个正则表达
谢谢;) 您可以将所有前缀合并到一个正则表达式中,并将随机数与之匹配:
#!/usr/bin/perl
use warnings;
use strict;
sub prefix_in_list {
my ($needle, $haystack) = @_;
my $regex = join '|', @$haystack;
return $needle =~ /^(?:$regex)/
}
use Test::More tests => 3;
ok prefix_in_list(45789277, [1, 2, 45, 757, 3, 7466]);
ok ! prefix_in_list(55366363, [1, 4, 3]);
ok prefix_in_list(55366363, [6535, 55, 1, 8]);
或者,如果您喜欢数字解决方案:
sub compute_length {
my ($n) = @_;
return int(log($n) / log 10)
}
sub prefix_in_list {
my ($needle, $haystack) = @_;
for my $prefix (@$haystack) {
my $start = $needle;
my $divider = 10 ** (compute_length($start) - compute_length($prefix));
return 1 if int($start / $divider) == $prefix;
}
return
}
您可以将所有前缀合并到一个正则表达式中,并将随机数与之匹配:
#!/usr/bin/perl
use warnings;
use strict;
sub prefix_in_list {
my ($needle, $haystack) = @_;
my $regex = join '|', @$haystack;
return $needle =~ /^(?:$regex)/
}
use Test::More tests => 3;
ok prefix_in_list(45789277, [1, 2, 45, 757, 3, 7466]);
ok ! prefix_in_list(55366363, [1, 4, 3]);
ok prefix_in_list(55366363, [6535, 55, 1, 8]);
或者,如果您喜欢数字解决方案:
sub compute_length {
my ($n) = @_;
return int(log($n) / log 10)
}
sub prefix_in_list {
my ($needle, $haystack) = @_;
for my $prefix (@$haystack) {
my $start = $needle;
my $divider = 10 ** (compute_length($start) - compute_length($prefix));
return 1 if int($start / $divider) == $prefix;
}
return
}
您还可以使用:
或者,如@choroba所述,可以使用:
return 1 if (index $num, $_) == 0;
请注意,index
将扫描整个字符串,即使它在位置0处未找到匹配项。因此,最有效的substr
和index
解决方案很可能取决于您的数据。您还可以使用:
或者,如@choroba所述,可以使用:
return 1 if (index $num, $_) == 0;
请注意,
index
将扫描整个字符串,即使它在位置0处未找到匹配项。因此,最有效的substr
和index
解决方案很可能取决于您的数据。如果干草堆中的任何项目都比针长(甚至可能与针的长度相同),则数字解决方案可能会呕吐;)此外,您还可以使用compute_length
差创建一个10的幂,使您在一次尝试中得到正确的除以数。@Tanktalus:谢谢,从数值解中删除了循环。如果草堆中的任何项目比针长(甚至可能与针的长度相同),数值的可能会呕吐;)此外,您还可以使用compute_length
差创建10的幂,从而在一次操作中获得正确的除以数。@Tanktalus:谢谢,从数值解中删除了循环。@choroba感谢您的建议。我已经更新了我的答案。索引
解决方案的一个缺点可能是,即使在零位没有找到匹配项,它也会扫描整个字符串。我可能会做的是,将索引与if一起使用,如果索引不是0,我将忽略它,因此这将是一个很好的解决方案…@choroba感谢您的建议。我已经更新了我的答案。索引
解决方案的一个缺点可能是,即使在零位没有找到匹配项,它也会扫描整个字符串。我可能会做的是,将索引与if一起使用,如果索引不是0,我将忽略它,因此这将是一个很好的解决方案。。。