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

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

最佳答案

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

  • 在编译时导入FindBin:
    use FindBin qw/$RealBin/;
    
    sub routine {
        say $RealBin;
    }
    

    我强烈建议这个解决方案。
  • 声明变量,以便它可以在没有 strictwarnings 提示的情况下使用:
    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 函数可能会有所帮助。
  • FindBin docs
  • require docs
  • 关于perl - 使用 "require"时如何导入变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22422879/

    10-16 17:43