2015-10-20 136 views
0

我知道如何在Perl中使用从一个包到另一个包的变量。我正尝试在另一个Perl脚本test2.pl中使用在test1.pl中声明的全局变量。我正在使用require加载perl文件。如何在另一个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"; 
} 
+0

它不是'out',其'our'。 – serenesat

+0

[Perl:如何在需要的脚本中提供需要脚本的变量](http:// stackoverflow。com/questions/7542120/perl-how-to-make-variables-from-require-script-available-required-script) – serenesat

+0

其实这个问题没有'warnings'。 – simbabque

回答

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.pl开始了在main包,因为没有package声明。当您require中没有package的脚本时,所有代码将在require语句所在的位置加载。它将以与require一行相同的包结束。那么test1.pl中的内容也会在同一个Perl实例的main包中结束。

our申报包变量。这意味着它可以在您的包裹内以$foo的形式提供,并且可以在外面看到。这就是诀窍。该声明与my $barscript1.pl

的东西会在自己的范围最终需要的文件时,这样的外部范围script2.pl不能看到该变量。但是,如果你将它变成一个包变量,它将被放入更大的包名称空间中。

我们首先声明包变量our $foo,然后require 'test1.pl'。在另一个脚本里面,我们再次做our $foo,所以没有$foo只能使用一次警告。打印$foo'bar'值将在包$foo(实际上是$main::foo,或$::foo如果ommit包的名称结束。从那里,稍后将访问。

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


一句忠告:虽然这东西似乎是容易,它很漂亮o utdated。当然,它适用于小事情,但很难维护。如果遗留应用程序已经存在并且重写过于昂贵,那么只能在遗留应用程序中使用这些东西。你已经知道包装了。改用它们!

4

如果您创建一个“真实”模块,这一切都会更加容易。像这样的图书馆需要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(); 
相关问题