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;