It would appear that this script is intended to be used interactively in a command-line shell. In that context, the typical approach for getting a list of file names from the user is to have the user provide the names on the command line, so that the script gets the list as @ARGV.
Every shell ever invented supports wildcard characters as a shortcut for specifying sets of file names on a command line, and every decent shell also provides tab completion of file names, so it's a lot easier for the user to supply file names on the command line when running the script. The user doesn't need to answer a question about how many files will be specified, and doesn't need to worry about typing mistakes while the script is running.
None of the snippets in the OP are necessary if the script can be run from the command-line prompt like this:
my_script.pl *.foo # (matches all files with a ".foo" extension"
my_script.pl this_long_name.txt that_other_long_name.xml
# where hitting <tab> after "thi" and "tha" completes each name automa
Then the script just looks at @ARGV to know how many files were given, and what their names are:
printf "There were %d files mentioned on the command line:\n", scalar
print join "\n", @ARGV, '';