Perl 'require' in the start block

I have the following code:

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

I am just testing something, not production code ... I have bignumpragma on my machine (loadable with help use), I was wondering why it requiredoesn’t work as it should (I get exponential numbers, and not "large numbers ") in this case?

Thank,

+5
source share
3 answers

bignum import must be called before compiling the code that it is intended to execute, or it does not work. Here BEGIN calls the call before your actual call to compute_factorial, but not before the critical one is compiled 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;
} 
+3
BEGIN {
   require bignum;
   import bignum;
   my $x = 1;
}

require bignum;
import bignum;
my $x = 1;

, require import , my $x = 1; , bignum my $x = 1; my $x = Math::BigInt->new(1);. ,

use bignum;
my $x = 1;

BEGIN {
   require bignum;
   import bignum;
}
my $x = 1;

BEGIN {
   require bignum;
   import bignum;
   my $x = 1;
}

BEGIN {
   my $sub;
   if (eval { require bignum; }) {
      $sub = eval(<<'__EOI__') or die $@;
         use bignum;
         sub {
            my ($num) = @_;
            my $factorial = 1;
            $factorial *= $_ for 2..$num;
            return $factorial;
         }
__EOI__
   } else {
      $sub = sub { croak "Unsupported" };
   }

   *factorial = $sub;
}

, , .

BEGIN {
   my $sub;
   if (eval { require Math::BigInt; }) {
      require Math::BigInt;
      $sub = sub {
         my ($num) = @_;
         my $factorial = Math::BigInt->new(1);
         $factorial *= $_ for 2..$num;
         return $factorial;
      };
   } else {
      $sub = sub { croak "Unsupported" };
   }

   *factorial = $sub;
}
+2

, Perl bignum , . , , , , require. , .

big.pl

if (eval { require bignum; 1 }) {
    require big_loader;
}

print big_loader::big_num_returner();

print "still ok\n";

big_loader.pm

package big_loader;
use bignum;

sub big_num_returner {
    return 2**512
}

1;
0

All Articles