使用"require"时如何导入变量?

sid*_*com 3 variables import perl perl-module require

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

#!/usr/bin/env perl
use warnings;
use strict;
use 5.10.1;

sub routine {
    require FindBin;
    FindBin::->import( '$RealBin' );
    say $RealBin;
}

routine();
Run Code Online (Sandbox Code Playgroud)

给出这个输出

Global symbol "$RealBin" requires explicit package name at ./perl.pl line 9.
Execution of ./perl.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

amo*_*mon 11

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

  1. FindBin在编译时导入:

    use FindBin qw/$RealBin/;
    
    sub routine {
        say $RealBin;
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 请勿导入符号并使用完全限定名称:

    sub {
        require FindBin;
        # FindBin->import;  # does nothing here
        say $FindBin::RealBin;
    }
    
    Run Code Online (Sandbox Code Playgroud)

FindBin从性能角度来看,在运行时加载可能是无用的,你应该use正常.如果您正在进行这些奇怪的运行时体操,以便$RealBin在每次调用时重新计算routine,这些解决方案都不会起作用,因为require如果已经加载了模块,它就不会执行模块(它有类似的功能$INC{'FindBin.pm'} or return).该FindBin::again功能可能会有所帮助.