Perl does not provide API compatibility with the minor version, i.e. you can't run 5.36 binary modules with 5.38 perl. The API is compatible with patch versions, that's why there are the perl(:MODULE_COMPAT_XXX) provides. If a new patch version is released, a new provides is added so that all the old patch versions are still provided. The version requires is a result of the search path built into perl. For example, perl -V will show the following include path: /usr/lib/perl5/site_perl/5.38.2/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.38.2 /usr/lib/perl5/vendor_perl/5.38.2/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.38.2 /usr/lib/perl5/5.38.2/x86_64-linux-thread-multi /usr/lib/perl5/5.38.2 /usr/lib/perl5/vendor_perl/5.38.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.38.0 /usr/lib/perl5/site_perl As you can see, perl looks both in the 5.38.2 and 5.38.0 directories for modules. A module compiled for an old version is simply not in the search path and thus cannot be found. So the requires in the package is needed.