简而言之 - 是的,你基本上是在做 OO,但在某种程度上会让每个人都感到困惑。
做这样的潜艇的危险是你在远处行动。必须完全在其他地方寻找可能破坏您的代码的东西,这是一种糟糕的编码风格。
这通常是为什么要尽可能避免使用“全局变量”的原因。
对于一个简短的脚本,它并不重要。
关于返回值——Perl 默认返回最后一个表达式的结果。(见return
:)
(在没有显式返回的情况下,子例程、eval 或 do FILE 会自动返回最后计算的表达式的值。)
Perl 评论家标记它的原因是:
要求所有子例程以下列之一显式终止:return、carp、croak、die、exec、exit、goto 或 throw。
结尾处没有显式返回语句的子例程可能会令人困惑。推断返回值是什么可能具有挑战性。
此外,如果程序员不希望有一个重要的返回值,并且省略了一个返回语句,那么子例程的一些内部数据可能会泄漏到外部。
Perlcritic 并不总是正确的——如果你有充分的理由去做你正在做的事情,那么就把它关掉。只要您考虑过并意识到风险和后果。
就个人而言,我认为明确返回某些东西是更好的风格,即使它只是return;
.
无论如何,以(粗略的)OO方式重新起草您的代码:
#!/usr/bin/perl
use strict;
use warnings;
package MyArray;
my $default_array = [ 1,4,2,6,1,8,5,5,2 ];
sub new {
my ( $class ) = @_;
my $self = {};
$self -> {myarray} = $default_array;
bless ( $self, $class );
return $self;
}
sub get_array {
my ( $self ) = @_;
return ( $self -> {myarray} );
}
sub sort_array{
my ( $self ) = @_;
@{ $self -> {myarray} } = sort ( @{ $self -> {myarray} } );
for ( @{ $self -> {myarray} } ) {
print $_,"\n";
}
return 1;
}
sub push_array{
my ( $self ) = @_;
for ( 1 .. 9 ){
push @{$self -> {myarray}}, $_;
}
return 1;
}
sub pop_array {
my ( $self ) = @_;
for ( 1 .. 3 ){
pop @{$self -> {myarray}};
}
return 1;
}
1;
然后调用它:
#!/usr/bin/perl
use strict;
use warnings;
use MyArray;
my $array = MyArray -> new();
print "Started:\n";
print join (",", @{ $array -> get_array()} ),"\n";
print "Reshuffling:\n";
$array -> sort_array();
$array -> push_array();
$array -> pop_array();
print "Finished:\n";
print join (",", @{ $array -> get_array()} ),"\n";
它可能会被整理一下,但希望这能说明 - 在你的对象中,你有一个内部“数组”,然后你可以通过调用来“做一些事情”。
结果大致相同(我想我已经复制了逻辑,但不要完全相信这一点!)但是你有一个自给自足的事情发生。