As JavaFan said, the simplest solution is to just start your loop at 2:
sub isPrime($) {
$num = shift;
my ($i,$c);
for ($i = 2; $i < $num / 2; $i++)
{
if ($num % $i == 0){$c += 1;}
}
if ($c == 1){return 1;}
return 0;
}
The above does however produce a false negative for isPrime(2). It produces a negative for isPrime(1) which is probably correct, but could be considered to be a false depending on your stance on the much debated primality of 1.
Better though is:
use 5.010;
use strict;
sub isPrime (_)
{
my $num = shift;
for my $div (2 .. sqrt $num) # start at 2, end at sqrt($n)
{
return if $num % $div == 0; # return false if $n evenly divid
+es
}
return 1; # return true if we got through the entire loop
}
for (1 .. 30)
{
if (isPrime)
{
say "$_ is prime";
}
else
{
say;
}
}
I've folded in JavaFan's other suggestions, plus changed your prototype from ($) to (_). Prototypes are rarely helpful  you're best off leaving them out usually. In this case though, the (_) prototype is quite cool, because what it does is, if isPrime is called with no argument at all, then it checks $_.
Other suggestions: consider what should happen for isPrime(1), isPrime(0), isPrime(3) and isPrime("chimpanzee"). Add checks for those special cases before the for my $div loop. The above implementation claims all the above are prime, except 3 which dies.
In mathematical circles, 1 is (these days) not usually regarded as prime, and asking the question of nonnatural numbers (i.e. nonintegers, and integers lower than 1) does not make sense. Bearing that in mind...
use Carp qw/croak/;
sub isPrime (_)
{
my $num = shift;
return if $num == 1; # 1 is not prime
croak "usage: isPrime(NATURAL NUMBER)"
unless $num =~ /^[19][09]*$/;
for my $div (2 .. sqrt $num)
{
return if $num % $div == 0;
}
return 1;
}
perl E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]>[3])=~s{::}{ }and$monkey}}"Monkey say">Monkey::do'
