The problem is that do won't trap syntax errors in the configuration file. This may not seem like an issue at first, but suppose the application is a daemon that is supposed to re-read its configuration file when it receives a HUP signal. This gives us all the benefits of require and still enables us to reread the same configuration file. In one of my early columns, I talked about writing portable Perl scripts that read in a configuration file that contained machine-specific configuration information. Assuming the scripts used the variables set in the configuration file, they would be completely portable across every machine on the network.
Configurations files can, of course, contain more than simple scalar variables.
For example, I wrote myself a little program that splits my mailbox up into smaller files based on who the email comes from. I usually get and just concentrate on mail sent by individuals. It is even possible to define subroutines in the configuration files. Generally avoid using symbols in a configuration file that will clash with variables and function names in the programs. One simple solution is to use all uppercase symbols in configuration files and all lowercase symbols in programs.