Just check @ARGV after you parse your options:
use Getopt::Long;
my $data = "file1";
my $length = 4;
my $verbose;
GetOptions (
"length=i" => \$length,
"file=s" => \$data,
"verbose" => \$verbose
);
if (!@ARGV) {
print "$0: Argument required.\n";
exit 1
}
I also like to use POD to document my code; thus, pod2usage can be invoked to produce 'nicer' usage output:
use Pod::Usage;
...
GetOptions(
...
) or pod2usage(-verbose => 0);
...
# Make sure at least one argument provided
if (!@ARGV) {
pod2usage(-verbose => 0, -message => "$0: argument required\n")
}