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

3

我知道如何在Perl中从一个包中使用变量到另一个包中。我正在尝试在另一个Perl脚本test2.pl中使用在test1.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";
}

不是“out”,而是“our”。 - serenesat
实际上,这个问题没有“警告”。 - simbabque
2个回答

10

如果您创建一个“真正的”模块,所有这些都会变得更加容易。像这样要求库是一种 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();

6

你需要在两个脚本中都使用 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由于没有package声明而始于main包。当您调用一个没有package的脚本时,在require语句所在的位置将加载所有代码。它将进入与require行相同的包中。所以test1.pl中的内容也最终进入了同一Perl实例的main包。 our声明了一个包变量,这意味着它可以在您的包内使用$foo变量,并且可以在外部使用。这就是这里的诀窍。
script1.pl中使用my $bar声明的内容将在文件被调用时进入自己的作用域,因此外部作用域script2.pl无法看到该变量。但如果您将其设置为包变量,则会将其放入包命名空间中,这个空间更大。
我们首先声明包变量our $foo,然后require 'test1.pl'。在其他脚本中,我们再次使用our $foo,因此不会出现$foo used only once警告。 'bar'的值最终将进入包$foo(实际上是$main::foo或如果您省略包的名称,则是$::foo)。从那里,稍后将通过打印$foo来访问它。 ourrequire的顺序并不重要。但如果您使用全局变量,则最好遵循一些惯例,例如在脚本顶部列出所有全局变量。
建议:虽然这些内容似乎很容易,但它们已经过时了。当然,对于小型事物,它仍可用,但很难维护。如果已经存在并且重新编写成本太高,请仅在传统应用程序中使用此类内容。您已经知道了包的相关信息,因此请尽量使用它们!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接