“使用空文件名”错误

时间:2011-08-01 12:39:35

标签: perl require

#!/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 个答案:

答案 0 :(得分:1)

您必须使用一个命令行参数调用您的程序:

./getting myfilename

否则你试图转变为不存在的变量!

另一种方法是直接引用参数并添加一个检查:

my $num_args = $#ARGV + 1;

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

my $file = $ARGV[0];

答案 1 :(得分:0)

这是重现错误消息的最小示例代码。实际错误不在-e行,而在nullfn.pm。您可能尝试在包含文件(/root/perl/arg)的第13行上的require中使用空字符串(undef?)。 调用文件(./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 :(得分:0)

问题是你需要做2件事。您假设“空文件名”错误来自第一个错误,但实际上来自第二个错误。

第一个要求是在第6行发布的代码中。它获取您在命令行“”/ root / perl / arg“上传递的值。第二个要求位于”/ root / perl / arg“在第13行。由于某些原因,它没有获得值。当它没有值时,它会以“空文件名”错误消失。然后执行返回到第6行的require并且perl报告“编译失败”。

以下是您的代码的修改版本,它解释了正在发生的事情:

$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”,我们不会进行第三次运行。

答案 3 :(得分:0)

我发现它工作的另一种方法是在require语句中提供包的完整路径。