cal_prime.pm v0.3.5

跟着prime_main改的,返回两个新prime的数组变量保存新算出来的prime给主程序,主程序再提供给write_db()。

#!/usr/bin/perl
# file:cal_prime.pm
# calculate prime.
# by:1e0n 05/10/26 v0.3.5

package cal_prime;
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(cal_prime_by_step);

sub cal_prime_by_step {
    # Use Typeglob to make a efficient prarmeter passing
    local (*cp_prime_n_array,*cp_prime_step_id,*cp_new_prime_id_array,*cp_new_prime_n_array) = @_;
    @cp_new_prime_id_array = ();
    @cp_new_prime_n_array = ();
    $prime_n_last = $cp_prime_n_array[-1];
    my $prime_id_count = @cp_prime_n_array-1;
    #print "prime_n_array:        @cp_prime_n_array\n";
    #print "last prime:        $prime_n_last\n";
    #print "count:            $prime_id_count\n";
    #print "sqrt_of_prime_id:    $cp_prime_step_id\n";
    #print "sqrt_of_prime_n:    $cp_prime_n_array[$cp_prime_step_id]\n";

    # Use Typeglob to change name
    local *prime = *cp_prime_n_array;
    local *last_num_to_cal = *prime_n_last;

    # We can use "do{something;}while();" function in the follow code
    # but it’s unclear
    $last_num_to_cal += 2;
    $cp_prime_step_id++;

    # Go into a calculate prime step
    while ($last_num_to_cal < $prime[$cp_prime_step_id]**2) {
        $if_prime = 1;
        #print "checking $last_num_to_cal with step $cp_prime_step_id\n";

        for (1..$cp_prime_step_id) {
            if ($last_num_to_cal % $prime[$_] == 0) {
                $if_prime = 0;
                last;
            }
        }

        if ($if_prime) {
            $prime[++$prime_id_count] = $last_num_to_cal;
            push @cp_new_prime_id_array,$prime_id_count;
            push @cp_new_prime_n_array,$last_num_to_cal;

            #print "$prime_id_count prime is $last_num_to_cal\n";
            #print $last_num_to_cal."    ";
        }

        $last_num_to_cal += 2;
    }
}

1;

Leave a Reply