my
这有点像,our
和之间的区别local
。差异很重要,但您应该在my
99% 的时间内使用。
Perl 是一种相当古老而粗鲁的语言。多年来,它已经从组合的 awk/shell/kitchen sink 语言发展成为一种更强大的类型化和更强大的语言。
回到 Perl 3.x 中,在模块和包的概念固化之前的几天,没有模块有自己的函数和变量命名空间的概念。一切都随处可见。没有什么可导入的。use
关键字不存在。你总是用require
.
到 Perl 5 出来的时候,模块已经有了自己的变量和子例程名称的存储。因此,我可以$total
在我的程序中使用,我的Foo::Bar
模块也可以使用$total
,因为 my $total
was really$main::total
和 their $total
are really $Foo::Bar::total
。
导出是一种使模块中的变量和子例程可用于主程序的方法。这样,您可以说copy( $file, $tofile);
而不是File::Copy::copy( $file, $tofile );
.
关键字只是为您自动化的use
东西。另外,在程序执行之前的编译时use
运行。这允许模块使用原型,所以你可以说代替或代替foo( @array )
foo( \@array )
munge $file;
munge( $file );
正如它在使用perldoc 的页面中所说:
它 [use]完全等同于:
BEGIN { require Module; Module->import( LIST ); }
基本上,您应该使用use
超过require
99% 的时间。
我只能想到一个需要使用require
over的场合use
,但这只是为了模仿use
. 有时模块是可选的。如果Foo::Bar
可用,我可能会使用它,但如果没有,我不会。如果我可以检查是否Foo::Bar
可用,那就太好了。
让我们试试这个:
eval { use Foo::Bar; };
my $foo_bar_is_available = 1 unless ($@);
如果Foo::Bar
不可用,我得到这个:
Can't locate Foo/Bar.pm in @INC (@INC contains:....)
那是因为use
发生在我可以运行 eval 之前。use
但是,我知道如何模拟require
:
BEGIN {
eval { require Foo::Bar; Foo::Bar->import( qw(foo bar barfu) ); };
our foo_bar_module_available = 1 unless ($@);
}
这确实有效。我现在可以在我的代码中检查这一点:
our $foo_bar_module_available;
if ( $foo_bar_module_available ) {
fubar( $var, $var2 ); #I can use it
}
else {
... #Do something else
}