这不起作用(下面的错误消息).我怎么能做这个工作?
#!/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.
解决方法
require和import在运行时发生,而变量必须在编译时声明.所以我们有三个解决方案:
>在编译时导入FindBin:
use FindBin qw/$RealBin/; sub routine { say $RealBin; }
我强烈建议这个解决方案.
>声明变量,以便可以在没有严格或警告的情况下使用它:
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可能是无用的,您应该正常使用它.如果您正在进行这些奇怪的运行时体操以在每次例程调用时重新计算$RealBin,这些解决方案都不会起作用,因为如果已经加载模块,则需要执行该模块(它会像$INC {‘那样) FindBin.pm’}或返回). FindBin :: again函数可能会有所帮助.