如何在使用&#34时导入变量;需要"?

时间:2014-03-15 10:58:40

标签: perl variables import require perl-module

这不起作用(下面的错误消息)。我怎么能做这个工作?

#!/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.

1 个答案:

答案 0 :(得分:11)

requireimport在运行时发生,而变量必须在编译时声明。所以我们有三个解决方案:

  1. 在编译时导入FindBin

    use FindBin qw/$RealBin/;
    
    sub routine {
        say $RealBin;
    }
    

    我强烈建议这个解决方案。

  2. 声明变量,以便在没有strictwarnings投诉的情况下使用该变量:

    sub routine {
        require FindBin;
        FindBin->import('$RealBin');
        our $RealBin;  # this just declares it so we can use it from here on
        say $RealBin;
    }
    
  3. 不要导入符号并改为使用完全限定名称:

    sub {
        require FindBin;
        # FindBin->import;  # does nothing here
        say $FindBin::RealBin;
    }
    
  4. 从性能角度来看,在运行时加载FindBin可能是无用的,你应该正常地use。如果您正在进行这些奇怪的运行时体操以在$RealBin的每次调用中重新计算routine,则这些解决方案都不会起作用,因为require如果已经执行模块$INC{'FindBin.pm'} or return已加载(它的作用类似于FindBin::again)。 {{1}}函数可能会有所帮助。