The reason @xls is empty is because you did not assign it any values. Typically, this is done by passing a variable reference to GetOptions for it to assign values to the variable (but using a sub might also accomplish this). It's not clear to me yet what you are trying to do. Please update your post with expected values for your variables.
UPDATE:
use strict;
use warnings;
use Getopt::Long();
sub usage {
my $message = shift(@_);
if ( defined $message && length $message ) {
$message .= "\n"
unless $message =~ /\n$/;
}
my $command = $0;
$command =~ s#^.*/##;
print STDERR ( $message, "usage: $command -f file(s).xls -p file.c
+sv\n" );
die("\n");
}
my @xls;
my $csv;
print "This is the number of \@ARGV arguments before the process " . @
+ARGV . "\n";
Getopt::Long::GetOptions(
'f=s' => \@xls,
'p=s' => \$csv,
) or usage("Invalid commmand line options.");
usage("The '*.xls' file(s) needs to be specified.")
if scalar( @xls == 0 );
usage("The '*.csv' file needs to be specified.")
unless defined $csv;
print "Input given form \@xls: " . @xls . "\n";
print "Input given form \$csv: " . $csv . "\n";
use Data::Dumper;
print Dumper(\@xls);
__END__
Here is my output:
This is the number of @ARGV arguments before the process 6
Input given form @xls: 2
Input given form $csv: test.csv
$VAR1 = [
'sample.xls',
'test.xls'
];