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

标签 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.

最佳答案

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

  • 进口 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功能可能会有所帮助。
  • FindBin docs
  • require docs
  • 关于perl - 使用 "require"时如何导入变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22422879/

    相关文章:

    mysql - 使用 phpmyadmin 将单列 csv 文件导入 mysql

    mysql - Perl 模块实例化 + DBI + fork "Mysql server has gone away"

    perl - 无法检查变量

    perl - 如何将键从散列复制到数组而不重复?

    java - 声明一个全局变量,或者在每个类中声明多次

    python - 如何在 SPSS Python 中查找变量的索引值

    eclipse - gwt> 导入示例项目

    Linux命令用重定向输出的文本替换文件中的文本

    ruby - 即使 IF 条件在 Ruby 中的计算结果为 false,如何创建局部变量?

    python - 如何从同级文件夹中导入 Python 模块?