首页 > 解决方案 > 如何检查一个数字是否以perl中的其他数字开头

问题描述

我需要帮助创建一个获取随机数的函数(例如 45789277),并将检查上面的数字是否以始终相同的数字列表之一开头(例如 [1,2,45,757, 3, 7466])

如果给定的数字是 55366363 并且列表是 [1,4,3],则函数将返回 False,如果列表是 [6535,55,1,8],则函数将返回 True *不可能数字将从列表中的两个数字开始 *给定数字的第一个数字永远不会是 0 *在列表中会有不同长度的数字(一/二/三/四位数字)*给定的数字将始终有更多数字然后是列表中的数字

谢谢 ;)

标签: perl

解决方案


您可以将所有前缀加入正则表达式并匹配随机数:

#!/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
}

推荐阅读