这不起作用(下面的错误消息)。我怎么能做这个工作?
#!/usr/bin/env perl
use warnings;
use strict;
use 5.10.1;
sub routine {
require FindBin;
FindBin::->import( '$RealBin' );
say $RealBin;
}
routine();
提供此输出
Global symbol "$RealBin" requires explicit package name at ./perl.pl line 9.
Execution of ./perl.pl aborted due to compilation errors.
答案 0 :(得分:11)
require
和import
在运行时发生,而变量必须在编译时声明。所以我们有三个解决方案:
在编译时导入FindBin
:
use FindBin qw/$RealBin/;
sub routine {
say $RealBin;
}
我强烈建议这个解决方案。
声明变量,以便在没有strict
或warnings
投诉的情况下使用该变量:
sub routine {
require FindBin;
FindBin->import('$RealBin');
our $RealBin; # this just declares it so we can use it from here on
say $RealBin;
}
不要导入符号并改为使用完全限定名称:
sub {
require FindBin;
# FindBin->import; # does nothing here
say $FindBin::RealBin;
}
从性能角度来看,在运行时加载FindBin
可能是无用的,你应该正常地use
。如果您正在进行这些奇怪的运行时体操以在$RealBin
的每次调用中重新计算routine
,则这些解决方案都不会起作用,因为require
如果已经执行模块$INC{'FindBin.pm'} or return
已加载(它的作用类似于FindBin::again
)。 {{1}}函数可能会有所帮助。