两段perl代码,麻烦帮忙看看

两段perl代码,麻烦帮忙看看

(1)
sub new_node {
my $self = shift;
my $class = ref($self) || $self;
my $node = {};
$node->{LEFT} = $node->{RIGHT} = $node;
$node->{DATA} = [ @_ ];
return bless $node, $class;
}
这段代码是说应用进行了循环定义,我不太明白为什么会是循环定义的

(2)
package FOO;
sub new {
my $type = shift;
return bless {}, $type;
}
sub bar {
my $self = shift;
$self->FOO::private::BAZ;
}
package FOO::private;
sub BAZ {
print "in BAZ\n";
}
package main;
$a = FOO->new;
$a->bar;

it illustrates a class that uses a fully qualified method call to access the "private"
method BAZ().
不是很明白,package FOO::private;是什么意思? 为什么BAZ会是私有的呢?

谢谢了!
那个是perl包的名字,这个问题很基础。。。
2.理解错误
我理解的意思就是perl没有所谓的“私有”方法,你在其他语言比如c++里面都有很严格的检查,如果是私有的则不能访问,但是perl不一样,它没有硬性的规定你只能访问接口中定义的一些方法(@EXPORT和@EXPORT_OK),无论何时,无论何地,你都可以用全名访问那些没有在接口中写出的方法(这个方法很可能是module的作者不想让外部访问的,或许会随着版本的升级而消失)
这也是上文中的private加引号的原因
问题2我已经明白了,谢谢!
关于问题1我还是不明白,什么叫包的名字啊?我以为
$node->{LEFT}就是$node hash中key为LEFT的值吧,为什么会循环使用引用呢?
在没有理解perl里面的包与对象之前,不要随意写代码啊。

说句实在的,你这些代码有多又乱,我连看的勇气都没

贴出错信息吧
或许错的是其他地方
什么叫循环定义?第一个例子只是一个基础的类构造方法而已

所谓的私有方法也只是一个相对的说法,你在main包里面也可以用FOO::private::BAZ调用BAZ,
这里说它是私有,意思是不能通过一个类方法来调用private里面的方法吧,比如不能$a->BAZ
可能是我表达不准确了,不好意思。

这个代码不是我写得,是programming perl书中提供的范例,我贴出来的,具体原话如下:
For example, here's a self-referential node such as one might use in a sophisticated tree structure:
sub new_node {
my $self = shift;
my $class = ref($self) || $self;
my $node = {};
$node->{LEFT} = $node->{RIGHT} = $node;
$node->{DATA} = [ @_ ];
return bless $node, $class;
}
If you create nodes like this, they (currently)[15] won't ever go away unless you break the circular
references yourself
典型的断章取义啊
原文说的是perl的自动垃圾收集机制,只要一个变量的索引不为零,则就不会自动销毁
对于你说的例子,因为

[Copy to clipboard] [ - ]
CODE:
$node->{LEFT} = $node->{RIGHT} = $node;

这一句对$node自身进行了引用,即使当对象销毁了,由于$node存在自身引用,所以它的空间也不会回收
不是循环定义
因为$node的左节点和右节点都指向自身(引用其实就是一个标量),所以存在自身的引用
你理解了下面这个就明白了,都是一回事,只不过一个拿对象包装了一下

QUOTE:
A more serious concern is that unreachable memory with a non-zero reference count will not normally get freed. Therefore, this is a bad idea:

    {
        my $a;
        $a = \$a;
    }

Even thought $a should go away, it can't. When building recursive data structures, you'll have to break the self-reference yourself explicitly if you don't care to leak.

正如楼上说的,这是循环引用而不是循环定义。