perl - 如何检查一个数字是否以perl中的其他数字开头
问题描述
我需要帮助创建一个获取随机数的函数(例如 45789277),并将检查上面的数字是否以始终相同的数字列表之一开头(例如 [1,2,45,757, 3, 7466])
如果给定的数字是 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
}
推荐阅读
- flutter - 是否可以在小部件中使用上下文?
- android - 无法在写事务之外修改托管对象
- deployment - 使用办公网络时无法使用 Salesforce DX 部署代码
- c# - 从列表中填充 DataGridView
- javascript - 使用 for...of 循环删除数组项
- sql - SQL:如何通过某些列的值“拆分”表中的行?
- kubernetes - 最先进的作业调度(容器、混合云)?
- javascript - 如何防止 emojionearea 内容中的 SQL 注入?
- java - java.sql.SQLSyntaxErrorException:表/视图'SEQUENCE'不存在
- django - Django 2.2+调用rest api,过滤id列表