`sub is_fibonnacci {
my $plus = (5 * $_[0] * $_[0]) + 4;
my $mins = (5 * $_[0] * $_[0]) - 4;
return is_perfect_square($plus) | is_perfect_square($mins);
}
`

No need to calculate `5 * $_[0] * $_[0]` twice, and you probably meant to use the logical or operator instead of the bit-wise or operator.

`sub is_fibonnacci {
my $plus = (5 * $_[0] * $_[0]) + 4;
my $mins = $plus - 8;
return is_perfect_square($plus) || is_perfect_square($mins);
}
`

(The logical operators short-circuit so `is_perfect_square($mins)` will only execute if `is_perfect_square($plus)` is true.)

`sub is_perfect_square {
my $sqrt = int(sqrt($_[0]));
return $sqrt * $sqrt == $_[0];
}
`

Or just:

`sub is_perfect_square { int( $_[0] ** .5 ) ** 2 == $_[0] }
`

Comment onRe: Zeckendorf representationSelectorDownloadCode