#!/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.
但文件确实存在,为什么??
答案 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语句中提供包的完整路径。