一些小Perl提示:
- 每当您遇到问题时,请使用 Data :: Dumper 。
Data :: Dumper
将帮助您了解结构。
- 如果您要全面采用面向对象的方式,则应全面采用此方式。 您具有构造函数和方法。 方法应返回值,并且您操作这些值。 每个方法和构造函数都应尽可能独立,并且对整体对象结构知识很少。
- 在
main
包中操作。 您应该翻转程序。 最后两个语句应位于顶部,并在下方定义您的包。
如果您调用$ self
并转储其数据,则会意识到$ self
是一个具有三个键的哈希,而 options
键指向一个匿名数组。
为了实现您想要的功能,您必须取消引用该匿名数组:
sub print_options {
my($self) = @_;
for ( @{$self->{options} } ) {
print $_ . "\n";
}
}
然而,我们需要整理一下你的程序,让它成为一个完整的类。首先,方法不会打印内容--它们会返回值。因此,你不应该有一个print_options
方法。相反,它应该返回数组(或者是数组的引用)。
此外,你的构造函数不需要知道你的Options
是如何结构化的。如果你改变它了呢?让我们看看改过后的程序:
use warnings;
use strict;
use feature qw(say);
my $setup = Foo->new;
for my $option ( $setup->Option ) {
say $option;
}
package Foo;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
$self->Option("PHP + Apache");
$self->Option("PHP + Lighthttpd");
$self->Option("PHP + Nginx");
$self->Option("RubyGems + Rails");
$self->Option("Node JS + NPM");
return $self;
}
sub Distro {
my $self = shift;
my $distro = shift;
if ( defined $distro ) {
$self->{DISTRO} = $distro;
}
return $self->{DISTRO};
}
sub Package_Manager {
my $self = shift;
my $package = shift;
if ( defined $package ) {
$self->{PACKAGE} = $package;
}
return $self->{PACKAGE};
}
sub Option {
my $self = shift;
my $option = shift;;
if ( not exists $self->{OPTION} ) {
$self->{OPTION} = [];
}
if ( defined $option ) {
push @{ $self->{OPTION} }, $option;
}
my @array = @{ $self->{OPTION} };
return wantarray ? @array : \@array;
}
首先,与PHP不同,Perl在执行之前会对代码进行编译。因此,您可以在程序底部定义包及其子例程。上面几行代码在默认的“main”包中操作。如果我在我的“Foo”包中使用了包变量,我就不会意外地在程序中使用它。
请注意,我的方法或构造函数都不知道“Foo”对象的结构。当我在我的“new”构造函数中设置选项时,我调用我的“Option”方法进行设置。这样,如果我改变存储选项的方式,我只需要更改我的“Option”方法,而不必担心在我的包中还需要更改哪些内容。它也简化了我的程序并使其更易于支持。
通过将我的“Option”方法设置为设置或获取选项,我简化了代码。我可以看到我正在匿名数组中存储选项,并且很明显当我返回对象时需要对其进行解引用。我喜欢使用“wantarray”并给用户选择他们想要一个数组还是数组的引用。
请注意,我不仅仅返回“$self->{OPTION}”。它是一个数组的引用,应该起作用,但如果我返回它,我就返回了该对象的内存位置!因此,如果用户更改该引用,他们就会更改我的对象,而不是通过我的方法。因此,我创建另一个数组,并返回对其的引用。无论您如何搞乱该数组引用,都不会更改我的对象。
这段代码还没有完成。我可以设置选项,但无法取消选项。可能有一种方法可以推送和弹出选项。在此时,您只能返回整个列表,而不能修改它。
use strict;
- 没有理由使用use strict "vars";
,因为它只打开了一些严格的规定。 - friedo