2015-10-20 132 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(); 
相關問題