my这有点像,our和之间的区别local。差异很重要,但您应该在my99% 的时间内使用。
Perl 是一种相当古老而粗鲁的语言。多年来,它已经从组合的 awk/shell/kitchen sink 语言发展成为一种更强大的类型化和更强大的语言。
回到 Perl 3.x 中,在模块和包的概念固化之前的几天,没有模块有自己的函数和变量命名空间的概念。一切都随处可见。没有什么可导入的。use关键字不存在。你总是用require.
到 Perl 5 出来的时候,模块已经有了自己的变量和子例程名称的存储。因此,我可以$total在我的程序中使用,我的Foo::Bar模块也可以使用$total,因为 my $totalwas really$main::total和 their $totalare 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超过require99% 的时间。
我只能想到一个需要使用requireover的场合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
}