首页 > 解决方案 > 为现有子动态添加前导下划线

问题描述

在 perl book 的这个例子中,“_components”是从哪里来的?我知道添加 _ 来表示 sub 是包私有的,但这个似乎无处不在使用领先分数。你能给我指出一些关于这个的来源吗?谢谢你。

package Computer;
@ISA = qw(StoreItem);

sub new {
    my $pkg = shift;
    my $obj = $pkg->SUPER::new("Computer", 0,0);
    $obj->{_components} = [];
    $obj->components(@_);
    $obj;
}

sub components {
    my $obj = shift;
    @_ ? push (@{$ojb->{_components}}, @_) : @{$obj->{_components}};
}

sub price {
    my $obj = shift;
    my $price = 0;
    my $component;
    for my $component ($obj->components()) {
        $price += $component->price();
    }
    $price;
}

标签: perl

解决方案


_components$obj散列引用的文字键。它不是“来自”任何地方。这是 Perl 语法的一个怪癖。在声明中

$obj->{_components} = [];

$obj是对新创建的类实例的引用(在前面的语句中),_components并被定义为该实例中的键,并被初始化为对空数组的引用。这相当于

$obj->{'_components'} = [];

例如

$ perl -de0

Loading DB routines from perl5db.pl version 1.55
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

main::(-e:1):   0
  DB<1> $obj->{a} = "hello";

  DB<2> x $obj
0  HASH(0x800756bf8)
   'a' => 'hello'
  DB<3> p $obj->{'a'}
hello
  DB<4> p $obj->{a}
hello
  DB<5>

推荐阅读