The main reason to use a module instead of just including a "lib.pl" with require, is to avoid polluting your namespace with the functions and variables from lib.pl. When you require a lib.pl script with no package name, all of its subs go into the main:: namespace, possibly overwriting things from your main script. It's also easier to understand where a sub is defined if it is called as "MyModule::foo()" instead of just "foo()" when there is no sub called foo in the main script.