该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构建细节如下.
Run Code Online (Sandbox Code Playgroud)> perl -v这是为MSWin32-x64多线程构建的perl 5,版本12,subversion 3(v5.12.3)(有9个已注册的补丁,有关详细信息,请参阅perl -V)
在某些时候,由于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位限制添加到要进行的改进列表中.
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |