我知道如何在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";
}
答案 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.pl
从main
包开始,因为没有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
时访问。
our
和require
的顺序并不重要。但是如果你使用全局变量,那么坚持一些约定是有意义的,比如列出脚本顶部的所有全局变量。
一条忠告:虽然这些东西似乎 easy ,但它已经过时了。当然它适用于小东西,但很难维护。只有遗留应用程序中的这些东西已经存在并且重写成本太高。你已经知道了包裹。改为使用它们!