Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl中检查一个数字是否以其他数字开头_Perl - Fatal编程技术网

如何在perl中检查一个数字是否以其他数字开头

如何在perl中检查一个数字是否以其他数字开头,perl,Perl,我需要帮助创建一个获取随机数的函数(例如45789277) 并将检查上面的数字是否以一个始终相同的数字列表开始 (例如[1,2,45757,37466]) 如果给定的数字为55366363,列表为[1,4,3],则函数将返回False;如果列表为[6535,55,1,8],则函数将返回True *该数字不可能从列表中的两个数字开始 *给定数字的第一位数字永远不会是0 *列表中有不同长度的数字(一位/两位/三位/四位) *给定的数字总是比列表中的数字多 谢谢;) 您可以将所有前缀合并到一个正则表达

我需要帮助创建一个获取随机数的函数(例如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,我将忽略它,因此这将是一个很好的解决方案。。。