Ошибка "Используется пустое имя файла"

#!/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" уже был необходим, мы не получаем третий запуск.

Другие вопросы по тегам