<?xml version="1.0" encoding="windows-1252"?>
<node id="328658" title="Re: fast, flexible, stable sort" created="2004-02-12 15:46:37" updated="2005-08-13 22:56:59">
<type id="11">
note</type>
<author id="190859">
bart</author>
<data>
<field name="doctext">
It doesn't work. Well, it &lt;em&gt;does&lt;/em&gt; work, but only if the XFORM routine returns &lt;em&gt;a string of the same length&lt;/em&gt; for every item. Otherwise, the sorting could turn out wrong.
&lt;P&gt;I've made a very contrived example, containing lots of null bytes, but actually, if you have a sufficiently large amount of array items, you can get the same effect on other bytes as well.
&lt;P&gt;Let me demonstrate the effect by sorting a number of variable length strings as is, and with the packed index appended. As is shown, the sorted results are not in the same order at all.
&lt;code&gt;
use Data::Dumper;
$Data::Dumper::Useqq = 1;
my @data = map "\0" x $_, 0 .. 5;
print Dumper [ sort @data ],
  [ sort map pack("a*N", $data[$_], $_), 0 .. $#data ];
&lt;/code&gt;
Result:
&lt;code&gt;
$VAR1 = [
          "",
          "\0",
          "\0\0",
          "\0\0\0",
          "\0\0\0\0",
          "\0\0\0\0\0"
        ];
$VAR2 = [
          "\0\0\0\0",
          "\0\0\0\0\0\0\0\0\5",
          "\0\0\0\0\0\0\0\4",
          "\0\0\0\0\0\0\3",
          "\0\0\0\0\0\2",
          "\0\0\0\0\1"
        ];
&lt;/code&gt;

</field>
<field name="root_node">
287149</field>
<field name="parent_node">
287149</field>
</data>
</node>
