Using <>, shift or @ARGV to get input for perl scripts has extreme limitations. For example you may only be able to get one input stream, or need to have inputs in specific order, or need to have all inputs. Writing documentation and error messages becomes a burden.
A very useful perl library that I extensively use is Getopt::Long::Descriptive, a very simple yet powerful tool for perl input that provides error messages, validation of input, help messages and other useful features. Their manual page (link) gives much information about how to use, so I will just give a couple easy examples to make some use cases clear.