如何在另一个Perl脚本中使用变量?

时间:2015-10-20 07:00:31

标签: perl

我知道如何在Perl中使用从一个包到另一个包的变量。我试图在另一个Perl脚本test1.pl中使用test2.pl中声明的全局变量。我正在使用require加载perl文件。

#!usr/bin/perl    #test1.pl
use strict;
use warnings;

out $db_name;   #global variable to be used in another script

fun();

sub fun
{
$db_name = 'xxyy';
}




#!usr/bin/perl    #test2.pl
require 'test1.pl';    #require is used to include the perl script like we use "use" for importing packages
my $database = $db_name;    #global variable from previous script
use strict;
use warnings;

testing();

sub testing
{
print "$database\n";
}

2 个答案:

答案 0 :(得分:5)

如果您创建“真实”模块,这一切都会容易得多。要求这样的库是Perl 4技巧。

在DBName.pm中,您有:

package DBName;

use strict;
use warnings;

use base 'Exporter';
our @EXPORT = qw[$DBName];

our $DBName = 'xxyz';

1;

在调用程序中:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use DBName;

sub testing {
  say $DBName;
}

testing();

答案 1 :(得分:3)

您需要在两个脚本中使用our声明变量。

# test1.pl
use strict;
use warnings;

our ( $foo );

$foo = 'bar';

# test2.pl
use strict;
use warnings;

our ( $foo );
require 'test1.pl';

print $foo; # bar

您的脚本test2.plmain包开始,因为没有package声明。当require脚本中没有package时,所有代码都将在require语句所在的位置加载。它最终将与require行位于同一个包中。那么test1.pl中的内容也会出现在同一个Perl实例的main包中。

our声明包变量。这意味着它在您的包裹内部以$foo可用,并且在外面可见。这就是诀窍。

当需要文件时,my $bar内的script1.pl声明的内容最终会出现在自己的范围中,因此外部作用域script2.pl看不到那个变数。但是如果你把它变成一个包变量,它将被放入包名称空间中,这更大。

我们先声明包变量our $foo,然后再require 'test1.pl'。在其他脚本中,我们再次our $foo,因此没有 $foo仅使用一次警告。 'bar'的值最终会显示在$foo包中(实际上是$main::foo,如果您省略了包的名称,则会$::foo。从那里,它将是稍后在打印$foo时访问。

ourrequire的顺序并不重要。但是如果你使用全局变量,那么坚持一些约定是有意义的,比如列出脚本顶部的所有全局变量。

一条忠告:虽然这些东西似乎 easy ,但它已经过时了。当然它适用于小东西,但很难维护。只有遗​​留应用程序中的这些东西已经存在并且重写成本太高。你已经知道了包裹。改为使用它们!