是否有可能克服这种32位限制?

Zai*_*aid 2 perl 32bit-64bit

cartesian函数内部List::Gen似乎被我的64位Windows操作系统的32位无符号上限的限制:

use strict;
use warnings;
use List::Gen '*';
use 5.010;
use bigint;               # This didn't help either

say $List::Gen::VERSION;  # 0.80

my $diameters = range( 1, 175 );
my @five_in_a_row = ( $diameters ) x 5;

my $combinations = cartesian { \@_ } @five_in_a_row;

say 0+@$combinations;   # Should be 175**5 == 164_130_859_375
                        # prints -1+2**31  ==   2_147_483_647
Run Code Online (Sandbox Code Playgroud)

有没有办法克服这个限制?我的Perl构建细节如下.

> perl -v
Run Code Online (Sandbox Code Playgroud)

这是为MSWin32-x64多线程构建的perl 5,版本12,subversion 3(v5.12.3)(有9个已注册的补丁,有关详细信息,请参阅perl -V)

Eri*_*rom 5

在某些时候,由于perl拟合数组指示为32或64位整数,因此生成器的绑定接口将始终受到限制.超出该范围,您可以使用面向对象的接口来生成器,这不仅限于2**31-1并且比绑定接口快得多.

my $combinations = cartesian {\@_} map {range 1 => 175} 1 .. 5;

say $combinations->size; # 164130859375
Run Code Online (Sandbox Code Playgroud)

并获得一个元素:

my $x = $combinations->get(164130859374);
Run Code Online (Sandbox Code Playgroud)

要么

my $x = $combinations->(164130859374);
Run Code Online (Sandbox Code Playgroud)

我将在下一个版本发布之前将自动检测到的64位限制添加到要进行的改进列表中.