#!/usr/bin/perl -w
# File: usePrime
# Assigns the next lowest prime number to the tied scalar.

package PrimeVar;
use integer;

sub BEGIN {
  my @nums = (2..2003);
  while (@nums) {	# Sieve of Eratosthenes.  Not terribly fast.
    push @primes, $nums[0];
    @nums = grep { $_ % $nums[0] } @nums;
  }
}

sub isPrime {
  my $num = shift;
  my $sqrtn = int(sqrt($num));
  foreach $prime (@primes) {
    last if $prime > $sqrtn;
    return 0 unless $num % $prime; # Non-prime (divisible by a prime)
  }
  return 1;	# Must be prime
}

sub TIESCALAR { return bless (\ my $primeval, shift); }

sub FETCH { return ${shift()} }

sub STORE {
  my ($primeref, $newval) = @_;
  die "value $newval out of range" if (sqrt($newval) > $primes[$#primes]);
  $newval-- while (!isPrime($newval));
  $$primeref = $newval;
}

package main;

tie $prime, 'PrimeVar';
$prime = 17; print "$prime\n";
$prime = 36; print "$prime\n";
$prime = 750; print "$prime\n";
$prime = 4000000; print "$prime\n";
$prime = 4303089; print "$prime\n";

