Ошибка "Используется пустое имя файла"
#!/usr/bin/perl
{
my $file = shift;
print $file;
require $file;
}
беги как ./arg /root/perl/arg
получение:
Null filename used at /root/perl/arg line 13.
Compilation failed in require at ./arg line 6.
Но файл действительно существует, почему?
4 ответа
Вы должны вызвать вашу программу с одним аргументом командной строки:
./getting myfilename
В противном случае вы пытаетесь перейти в несуществующую переменную!
Альтернативой может быть прямая ссылка на аргумент и добавление проверки:
my $num_args = $#ARGV + 1;
if ($num_args != 1)
{
print "Error!";
exit;
}
my $file = $ARGV[0];
Еще один способ, с помощью которого я нашел его, - указать полный путь к пакету в операторе require.
Вот минимальный пример кода для воспроизведения ваших сообщений об ошибках. Фактическая ошибка не в -e
линия, но в nullfn.pm
, Вы, вероятно, пытаетесь использовать пустую строку (undef?) В require в строке 13 включаемого файла (/root/perl/arg
). Вызывающий файл (./arg
) все в порядке.
-bash$ cat nullfn.pm
#!/usr/bin/perl -w
require "";
1;
-bash$ perl -we 'require nullfn;'
Null filename used at nullfn.pm line 3.
Compilation failed in require at -e line 1.
Проблема в том, что вы делаете 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" уже был необходим, мы не получаем третий запуск.