perl - 为现有子动态添加前导下划线
问题描述
在 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;
}
解决方案
_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>
推荐阅读
- regex - Google表格(RE2)中的正则表达式“NOT”
- javascript - sinon 中的异步函数存根调用实际的函数调用
- c - Visual Studio Code (mac) 和语言 C 的问题
- python - flask_marshmallow 阻止加载新实体,但允许加载现有实体
- java - Java中的Magic Square程序帮助
- go - 在提供 CSS 时在 Golang 中出现 MIME 类型('text/plain')错误
- mysql - windows子系统安装mysql服务器
- java - 从服务器通过 ObjectInputStream 接收对象时出错
- servicestack - 如何在 ServiceStack 5.0 中向传入请求的标头添加新的名称值对?
- javascript - 如果 id 存在于 div 中,我需要做一些事情,如果没有,做其他事情