1

だから私はPerlを使ってLinked Listsを学ぼうとしています。Jon Orwant によるMastering Algorithms with Perlを読んでいます。本の中で、彼はリンクされたリストを作成する方法を説明しています。私はそのほとんどを理解していますNEXTが、コード スニペットの最後の 2 行目にあるコマンド/インデックス/キーを理解できていません。

$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、ハッシュへの参照ですか? 私は非常に混乱しています。

平易な英語の何かが高く評価されます。

4

2 に答える 2

6

NEXTスクリプトの前半で宣言された定数です。これには、次のノードを参照する現在のノードのメンバー要素のインデックスを表す整数値が含まれます。

このスキームでは、各ノードは小さな匿名配列です。この匿名配列の1つの要素にはペイロードが含まれ、もう1つの要素には次のノードを指す参照が含まれます。

その章の前の例のいくつかを見ると、次の宣言があります。

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での古典的なアルゴリズムの適用を理解するための優れたリソースだと思います。私はまだ時々それを参照します。

于 2012-06-07T22:24:17.903 に答える
2

NEXT前のページで宣言された、数値を含む定数です。配列 ref にアクセスするために通常の番号の代わりに使用されている$nodeため、リーダーはスロットがリンクされたリストの次の要素が格納されている場所であることを認識しています。

リスト以外のものを格納するために配列参照を使用する手法です。この手法は、ハッシュ参照を使用する場合と比較して、メモリと CPU 時間を節約することを目的としていました。実際には、パフォーマンスに大きな違いはなく、扱いにくいものです。この本は、Perl コードの書き方についての考え方がかなり古くなっています。代わりにハッシュ参照を使用してください。

my $list;
my $tail = \$list;
foreach my $num (1..5) {
    my $node = { data => $num };
    $$tail = $node;
    $tail = \$node->{next};
}
于 2012-06-07T22:35:10.787 に答える