如何在Perl中检查数字是否以其他数字开头

时间:2018-07-17 07:13:20

标签: perl

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

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

谢谢;)

2 个答案:

答案 0 :(得分:6)

您可以将所有前缀连接到一个正则表达式中,并根据它匹配随机数:

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

答案 1 :(得分:-1)

您也可以使用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;

请注意,即使index不会在位置0找到匹配项,也会扫描整个字符串。因此,substrindex的最有效解决方案很可能取决于您的数据。