Assigning default values to function arguments which may be "empty"
use 5.008009 is insufficient here, since you're using the // operator, which was introduced in Perl 5.10.

This function feels awkwardly designed.  Generally, parameters that have default values appear after all required parameters.  Here, I would need to explicitly pass in undef as the first parameter to take advantage of the default.  Also note that the parameters for your is_CORE are backwards relative to Module::CoreList::is_core.

I also don't understand the benefit of having the empty string trigger the default.  I can understand having undef trigger the default.  I could also agree with having all "falsy" values trigger the default.  But this particular design feels weird.  If I had to do it, though, I'd write it like this:

sub is_CORE {
    use 5.008009; # perl v5.8.9; required for Module::CoreList to be available in CORE
    my ($module, $min_perl_version) = @_;
    $min_perl_version = '5.008009' unless defined $min_perl_version &amp;&amp; length $min_perl_version;
    $Module::CoreList::VERSION &gt;= 2.99 &amp;&amp; Module::CoreList::is_core($module, undef, $min_perl_version);
}