我正在尝试创建一个类似这样的模块
package MyModule;
use strict;
use Exporter;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
$VERSION = 1.00;
@ISA = qw(Exporter);
@EXPORT = qw(func1);
sub func1 {
my x = shift;
print x;
func2();
}
sub func2 {
print x;
}
从perl脚本,我调用模块的func1并传递变量x。如何使该变量对两个子程序都可见或说出该模块中的所有函数。 请帮忙。
答案 0 :(得分:4)
使用$x
或my
在文件范围内声明our
:
my $x;
# subroutines definition
文件具有最大的词法范围,因此该变量对于其余代码是可见的(除非您使用my
在某些内部范围内重新声明它。)
答案 1 :(得分:3)
将$x
词汇赋予包文件而不是单个子例程:
package MyModule;
use strict;
use Exporter;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
$VERSION = 1.00;
@ISA = qw(Exporter);
@EXPORT = qw(func1);
my $x;
sub func1 {
$x = shift;
print $x;
func2();
}
sub func2 {
print $x;
}
但这个例子并没有多大意义。一个更明智的例子是定义一个词法文件句柄,包中的多个子程序打印到:
package PoorManLogger;
my $fileHandle;
sub initialize { open $fileHandle, '<', +shift }
sub alert { print $fileHandle 'ALERT: ', @_, "\n"; }
sub debug { print $fileHandle 'DEBUG: ', @_, "\n"; }
sub close { close $fileHandle; } # Though this isn't technically needed.
1;
答案 2 :(得分:2)
OO的主要好处之一是封装:
#!/usr/bin/perl
package MyModule;
use strict; use warnings;
sub new {
my $class = shift;
bless { x => shift } => $class;
}
sub x {
my $self = shift;
$self->{x} = shift if @_;
return $self->{x};
}
sub func2 {
my $self = shift;
print $self->x, "\n";
}
package main;
use strict; use warnings;
my $m = MyModule->new(5);
$m->func2;
$m->x(7);
$m->func2;
答案 3 :(得分:-1)
见our
(对我的建议的评论是正确的,我的建议不是)