在perl中创建链表时NEXT的含义

在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? } 他在

所以我尝试使用Perl学习链表。我正在读乔恩·奥旺特的作品。在书中,他解释了如何创建一个链表。 我理解其中的大部分内容,但就是不理解代码片段最后第二行中的命令/index/key
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}:)否则会导致很多混乱