我需要帮助创建一个函数,获取一个随机数(例如45789277),并检查上面的数字是否以始终相同的数字列表之一开始(例如1,2,45,757,3,7466)
如果给定的数字是55366363而列表是1,4,3函数将返回False,如果列表是6535,55,1,8函数将返回True *数字不可能从列表中的两个数字开始*给定数字的第一个数字永远不会是0*列表中将有不同长度的数字(一位/两位/三位/四位)*给定的数字的位数将始终多于列表中的数字
谢谢;)
发布于 2018-07-17 07:24:16
您可以将所有前缀连接到一个正则表达式中,并将随机数与其进行匹配:
#!/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
}
发布于 2018-07-17 07:29:20
您也可以使用substr
# Checks if a number $num has a prefix given by an item in @$list
sub starts_width {
my ( $num, $list ) = @_;
for (@$list) {
return 1 if (substr $num, 0, length $_) eq $_;
}
return 0;
}
或者,正如@choroba所提到的,可以使用index
:
return 1 if (index $num, $_) == 0;
请注意,即使在位置0处未找到匹配项,index
也会扫描整个字符串。因此,substr
和index
最有效的解决方案很可能取决于您的数据。
https://stackoverflow.com/questions/51375300
复制相似问题