如何让一个 Perl 脚本看到另一个 Perl 脚本中的变量?

9
我有一个Perl脚本,逐渐变得越来越复杂,所以我想将它拆分成多个脚本。具体来说,我想把一些大的哈希声明拿出来,放到另一个文件中。那么,我该如何让原始脚本能够看到并使用现在在另一个脚本中声明的变量呢?
这让我很烦恼,因为我已经有一段时间没有使用Perl了,也无法弄清楚这个问题。
4个回答

15

使用模块:

package Literature;

our %Sidekick = (
  Batman => "Robin",
  Bert   => "Ernie",
  Don    => "Sancho",
);

1;
例如:
#! /usr/bin/perl

use Literature;

foreach my $name (keys %Literature::Sidekick) {
  print "$name => $Literature::Sidekick{$name}\n";
}

输出:

$ ./prog 
Bert => Ernie
Batman => Robin
Don => Sancho

5
我认为Bert是Ernie的搭档,但他也是一个很好的榜样。 - Robert P
4
通过一些出口魔法,我们甚至可以使用'Literature qw(Sidekicks);'而不必使用完整的包名。 这会使软件包更加复杂,但最终是值得的。 - Chris Lutz
1
哎呀,导出变量?Perldoc 不是警告不要这样做吗? :) http://perldoc.perl.org/Exporter.html#What-not-to-Export - Robert P
@Robert P - OP想要在Perl脚本之间共享变量名称。因此,他的代码将使用来自模块的可能不稳定的变量,无论是否导出它们。我同意这可能不是最好的主意,但如果你小心谨慎,就没有什么明显的问题。 - Chris Lutz
1
默认情况下应避免导出。显式导出没有任何问题。 - friedo
显示剩余2条评论

10

我看到了那个,但是我可以发誓有一种更简单的方法。可能只是因为长时间工作后有点疯了... - John
8
@john:是的,还有其他方法,但它们违反了最佳实践,所以不应在此透露。 - Ether
这是最易于维护的方式,从长远来看也是最好的方式。如果必须这样做,您可以使用“do”函数运行另一个Perl脚本,因此您可以将所有变量声明放在“myvars.pl”中,然后执行“do myvars.pl”,但是如果这样做,那么您应该使用模块。 - Chris Lutz
@Ether - 哎呀!抱歉我泄露了它们。你是对的,它们不应该被使用。 - Chris Lutz

5

又一个使用模块的建议。

编写和使用模块并不难。只是在你自己编写之前,它们可能看起来比较困难。第一次尝试之后,就变得很容易了。许多好处可以从使用模块中获得,如封装、易于测试和易于代码重用等等。

查看我的回答中的示例模块以及导出的函数。

此外,Perl社区中某些非常聪明的人非常喜欢模块,以至于他们主张将应用程序编写为模块——他们称之为模块化编程。这种技术非常有效。

因此,总之,今天就尝试编写一个模块吧!


4
作为其他“使用模块”的建议的补充,如果您计划经常重复使用该模块,则需要将其安装到站点库中(通常位于...(perl install folder)...\site\lib下)。
如果不需要(也许在脚本之外具有有限的可重用性),则可以将其保留在与脚本相同的目录中,并像这样导入它:
use lib './lib'; # where ./lib is replaced with wherever the module actually is.
use MyModule;

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