开始 block 中的 perl 'require'

标签 perl module runtime require

我有以下代码:

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';

BEGIN {
       my $supported = undef;
       *compute_factorial = sub { if (eval { require bignum; bignum->import(); 1;}) {
                                    my $num       = shift;
                                    my $factorial = 1;
                                    foreach my $num (1..$num) {
                                        $factorial *= $num; 
                                    }
                                    return $factorial;
                                  }  else {
                                       undef;
                                     } };
       };

my $f = compute_factorial(25);
say $f;

我只是在测试一些东西,而不是真正的生产代码...... 我的机器上确实有 bignum pragma (可以使用 use 完美加载),我想知道为什么 require 不能按应有的方式工作(在这种情况下,我得到的是指数数字而不是“大数字”)?

谢谢

最佳答案

bignum 的导入需要在编译它想要实现的代码之前调用,否则它不起作用。在这里,BEGIN 使其在实际的compute_factorial 调用之前调用,但不是在编译关键my $factorial = 1; 之前调用。

对于这种情况,更好的方法是直接使用 Math::Big*:

if (eval { require Math::BigInt }) {
    my $num = shift;
    my $factorial = Math::BigInt->new(1);
    foreach my $num (1..$num) {
        $factorial *= $num;                            
    }
    return $factorial;
} else {
    undef;
} 

关于开始 block 中的 perl 'require',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11655042/

相关文章:

perl - 为什么我的 'use my_module;'占用这么多堆内存?

python - 从父文件夹子文件夹相对导入模块

module - OCaml 未绑定(bind)图形模块

python - 是否可以限制 python 中的一段代码对全局变量的访问?

perl - 使用 Term::Readline-readline 停止无限 while 循环的正确方法是什么?

HTML::Entities 编码和单符号

javascript - 减少es6模块导入语句的冗余

c++ - SDL 2.0 编译,但无法运行

c++ - 为什么我看不到 "Application Error"对话框?

perl - 如何使用 Perl 替换文件中间的行?