Ошибка «Используется пустое имя файла» - PullRequest
2 голосов
/ 01 августа 2011
#!/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 ]

1 голос
/ 01 августа 2011

Вы должны вызывать вашу программу с одним аргументом командной строки:

./getting myfilename

В противном случае вы пытаетесь перейти к несуществующей переменной!

Альтернативой может быть прямая ссылка на аргумент и добавление проверки:

my $num_args = $#ARGV + 1;

if ($num_args != 1)
{
  print "Error!";
  exit;
}

my $file = $ARGV[0];
0 голосов
/ 03 августа 2013

Другой способ, с помощью которого я нашел его, - указать полный путь к пакету в операторе require.

0 голосов
/ 01 августа 2011

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

0 голосов
/ 01 августа 2011

Вот минимальный пример кода для воспроизведения ваших сообщений об ошибках. Фактическая ошибка не в строке -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.
...