代码之家  ›  专栏  ›  技术社区  ›  Binary Worrier

为什么我的Perl脚本看不到我在另一个文件中定义的our()变量?

  •  5
  • Binary Worrier  · 技术社区  · 5 年前

    我有一个关于Perl和范围界定的问题。我有一个包含很多变量的公共文件。我需要主脚本中的公共文件,但无法访问变量;它们似乎超出了它的作用域。我以为 our 声明可以解决这个问题,但似乎不起作用。

    脚本1:common.pl

    #!/usr/bin/perl
    
    our $var1 = "something";
    our $var2 = "somethingelse";
    

    脚本2:ftp.pl

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    require('common.pl');
    
    print $var1; 
    

    我知道错误:

    Global symbol "$var1" requires explicit package name
    5 回复  |  直到 15 年前
        1
  •  8
  •   friedo    15 年前

    没有 require 你的第二个例子中的语句,但无论如何都不起作用。什么 our does声明一个词汇范围的包变量。既然你没有 package 语句,它使用默认包 main . 所以你的第一个脚本设置了变量 $main::var1 ,但这将仅在该文件的作用域内可用。

    为其他脚本提供公共变量的更好方法是 Exporter . 您可以在一个地方定义包符号,导出器将在需要时将它们复制到请求脚本或类的命名空间中。

        2
  •  7
  •   Nifle Hassan Syed    15 年前

    我会把配置放在一个模块中。

    文件: MyCopy.PM

    package MyConfig;
    require Exporter;
    use strict;
    
    our @ISA                = qw(Exporter);
    our @EXPORT             = qw( getconfig ); 
    
    my %confighash = ( 
                thisone => 'one',
                thatone => 2,
                somthingelse => 'froboz',
                       );
    
    
    
    sub getconfig {
     return  %confighash;
     }
    
    1;
    

    示例用法:

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use MyConfig;
    
    my %config = getconfig();
    
    print $config{ somthingelse };
    

    这个应该印出来 弗洛博兹

        3
  •  6
  •   brian d foy    15 年前

    看起来你需要一个正确的配置文件。我要一个非代码配置文件,你可以在需要设置时读取它。cpan上有一些模块可以处理您可以想象的任何配置格式。

    如果你想按你的方式去做,就摆脱它 our 并声明 use vars . 别让警察吓到你了。:)你只需要 我们的 限制一个包变量的范围,这与您所要做的恰恰相反。

        4
  •  2
  •   ysth    15 年前

    我们的()所做的事情与您想象的稍有不同。它的唯一目的是严格要求您声明要使用的包变量(除非它们是完全限定的或导入的)。与strict一样,它的作用在词汇上是有范围的。使用它允许访问全局 $main:var1 从多个文件(它们是独立的作用域)中 $var1 ,你得说 our $var1 在每个文件中。

    或者,您可以将所需的文件更改为具有自己的包的模块,该模块可以将变量导出到使用它的任何包。

        5
  •  1
  •   Tonia    14 年前

    试试这个。我是Perl新手,但这就是我如何让它在我编写的脚本上工作的方法

    #!/usr/bin/perl
    
    $var1 = "something";
    $var2 = "somethingelse";
    Script 2: ftp.pl
    
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    our $var1;
    our $var2;
    
    require('common.pl');
    
    print $var1;