Проблема в том, что вы делаете 2 требования. Вы предположили, что ошибка «Null filename» исходит от первой, но на самом деле от второй.
Первое требование содержится в коде, который вы разместили в строке 6. Он получает значение, которое вы передали в командной строке "" / root / perl / arg ". Второе требование находится в" / root / perl / arg " в строке 13. По какой-то причине он не получает значение. Когда он не получает значения, он умирает с ошибкой «Null filename». Затем выполнение возвращается к требованию в строке 6, и perl сообщает, что «Compilation failed».
Вот модифицированная версия вашего кода, которая объясняет, что происходит по ходу дела:
$main::runcount++;
{
print "beginning run number $main::runcount\n";
print "\tARGV has ", scalar @ARGV, " arguments\n";
my $file = shift;
print "\tabout to require file `$file`\n";
require $file;
}
1;
И вот вывод, когда я запускаю его с собой в качестве единственного аргумента:
~$ perl arg arg
beginning run number 1
ARGV has 1 arguments
about to require file `arg`
beginning run number 2
ARGV has 0 arguments
about to require file ``
Null filename used at arg line 9.
Compilation failed in require at arg line 9.
Из этого ясно, что ошибка «Null filename» генерируется вторым требованием.
Ради интереса я запускал скрипт, дважды передавая его собственное имя:
~$ perl arg arg arg
beginning run number 1
ARGV has 2 arguments
about to require file `arg`
beginning run number 2
ARGV has 1 arguments
about to require file `arg`
Здесь вы можете видеть, что второй запуск скрипта может получить значение из @ARGV
. Однако, так как «arg» уже был необходим, мы не получаем третий запуск.