在perl中创建链表时NEXT的含义
所以我尝试使用Perl学习链表。我正在读乔恩·奥旺特的作品。在书中,他解释了如何创建一个链表。 我理解其中的大部分内容,但就是不理解代码片段最后第二行中的命令/index/key在perl中创建链表时NEXT的含义,perl,linked-list,Perl,Linked List,所以我尝试使用Perl学习链表。我正在读乔恩·奥旺特的作品。在书中,他解释了如何创建一个链表。 我理解其中的大部分内容,但就是不理解代码片段最后第二行中的命令/index/keyNEXT $list=undef; $tail=\$list; foreach (1..5){ my $node = [undef, $_ * $_]; $$tail = $node; $tail = \${$node->[NEXT]}; # The NEXT on this line? } 他在
NEXT
$list=undef;
$tail=\$list;
foreach (1..5){
my $node = [undef, $_ * $_];
$$tail = $node;
$tail = \${$node->[NEXT]}; # The NEXT on this line?
}
他在那里想干什么
$node
是存储未命名数组地址的标量吗?此外,即使我们正在取消引用$node
,我们也不应该通过索引号引用单个元素,例如(0,1)。如果我们确实使用NEXT
作为键,$node
是对散列的引用吗?
我很困惑
用简单的英语写的东西将非常受欢迎。
NEXT
是一个常量,在脚本前面声明。它包含一个整数值,表示引用下一个节点的当前节点的成员元素的索引
在该方案下,每个节点都是一个小的匿名数组。这个匿名数组的一个元素包含有效负载,另一个元素包含指向下一个节点的引用
如果您查看该章前面的一些示例,您将看到以下声明:
use constant NEXT => 0;
use constant VAL => 1;
因此$node->[NEXT]
与$node->[0]
同义,后者包含链接列表链中下一个节点的引用,而$node->[VAL]
与$node->[1]
同义;存储在当前节点中的值(或有效负载)
我将评论您提供的代码片段:
foreach (1..5){
my $node = [undef, $_ * $_]; # Create a new node as an anon array.
# Set the previous node's "next node reference" to point to this new node.
$$tail = $node;
# Remember a reference to the new node's "next node reference" element.
# So that it can be updated when another new element is added on next iteraton.
$tail = \${$node->[NEXT]}; # The NEXT on this line?
}
顺便说一下,这本书很棒。我有好几本算法方面的书,这本书在这么多年后仍然是我的最爱
更新:我确实同意这本书不是当前惯用Perl或当前“最佳实践”Perl的模型,但我确实觉得它是一个很好的资源,有助于理解经典算法在Perl中的应用。我仍然不时地引用它。
NEXT
是一个常量,在脚本前面声明。它包含一个整数值,表示引用下一个节点的当前节点的成员元素的索引
在该方案下,每个节点都是一个小的匿名数组。这个匿名数组的一个元素包含有效负载,另一个元素包含指向下一个节点的引用
如果您查看该章前面的一些示例,您将看到以下声明:
use constant NEXT => 0;
use constant VAL => 1;
因此$node->[NEXT]
与$node->[0]
同义,后者包含链接列表链中下一个节点的引用,而$node->[VAL]
与$node->[1]
同义;存储在当前节点中的值(或有效负载)
我将评论您提供的代码片段:
foreach (1..5){
my $node = [undef, $_ * $_]; # Create a new node as an anon array.
# Set the previous node's "next node reference" to point to this new node.
$$tail = $node;
# Remember a reference to the new node's "next node reference" element.
# So that it can be updated when another new element is added on next iteraton.
$tail = \${$node->[NEXT]}; # The NEXT on this line?
}
顺便说一下,这本书很棒。我有好几本算法方面的书,这本书在这么多年后仍然是我的最爱
更新:我确实同意这本书不是当前惯用Perl或当前“最佳实践”Perl的模型,但我确实觉得它是一个很好的资源,有助于理解经典算法在Perl中的应用。我仍然不时地引用它。
NEXT
是一个常量,在前一页声明,包含一个数字。它被用来访问数组ref$node
,而不仅仅是普通的数字,因此读者知道插槽是存储链表中下一个元素的位置
这是一种使用数组引用来存储列表以外的内容的技术。与使用散列引用相比,该技术旨在节省内存和CPU时间。事实上,它对性能没有多大影响,而且使用起来也很尴尬。这本书关于如何编写Perl代码的想法有点过时了。改用散列引用
my $list;
my $tail = \$list;
foreach my $num (1..5) {
my $node = { data => $num };
$$tail = $node;
$tail = \$node->{next};
}
NEXT
是一个常量,在前一页声明,包含一个数字。它被用来访问数组ref$node
,而不仅仅是普通的数字,因此读者知道插槽是存储链表中下一个元素的位置
这是一种使用数组引用来存储列表以外的内容的技术。与使用散列引用相比,该技术旨在节省内存和CPU时间。事实上,它对性能没有多大影响,而且使用起来也很尴尬。这本书关于如何编写Perl代码的想法有点过时了。改用散列引用
my $list;
my $tail = \$list;
foreach my $num (1..5) {
my $node = { data => $num };
$$tail = $node;
$tail = \$node->{next};
}
感谢您的回复,我们是否应该有另一个键->值对来存储下一个节点地址。密钥的名称是“next”?@seleniumnewbie是的,这就是
$node->{next}
的含义。我还更改了$tail=\${$node->{next}
到$tail=\$node->{next}代码>:)或者它会导致很多混乱感谢您的回复,我们是否应该有另一个键->值对来存储下一个节点地址。密钥的名称是“next”?@seleniumnewbie是的,这就是$node->{next}
的含义。我还更改了$tail=\${$node->{next}
到$tail=\$node->{next}代码>:)否则会导致很多混乱