将数组引用插入Perl堆

将数组引用插入Perl堆,perl,arrays,insert,reference,Perl,Arrays,Insert,Reference,我正在用Perl将二维数组引用插入我的堆中。 在构建堆时,我应该如何定义'elements'属性,以便正确使用比较器函数 my $heap = Heap::Simple->new( order => \&byNumOrStr, elements => [Array => 0] ); sub byNumOrStr { my ( $

我正在用Perl将二维数组引用插入我的堆中。 在构建堆时,我应该如何定义'elements'属性,以便正确使用比较器函数

my $heap = Heap::Simple->new( order     => \&byNumOrStr,
                              elements  => [Array => 0]
                             );

sub byNumOrStr
{
    my ( $a, $b ) = @_;

    $b->[0] <=> $a->[0]  #0-th element is a number. 
            ||
    $a->[1] cmp $b->[1]; #1-st element is a number
}
my$heap=heap::Simple->new(order=>\&byNumOrStr,
元素=>[数组=>0]
);
sub byNumOrStr
{
我的($a$b)=;
$b->[0]$a->[0]#第0个元素是一个数字。
||
$a->[1]cmp$b->[1];#第一个元素是一个数字
}
我不断发现这个错误:


在使用“严格引用”时,无法将字符串(“2.55”)用作数组引用。。。(这意味着我可能实际上必须以数字形式比较我的“数字字符串”)

嗯,很可能是
$a
$b
作为字符串传入。在赋值后尝试打印此变量

从文档中我可以看到,当您传递
元素=>[Array=>0]
时,除非数组中的第0项是数组,否则您将只比较数组第一个插槽中的值

[Array=>$index]
指示元素是数组引用,键位于索引$index。因此,现在元素不仅可以是键,还可以是关联的数据。 这意味着如果2.55像[2.55,…]一样在数组中,那么这就是作为
$a
$b
传入的内容

elements
条目告诉
H::S
您希望如何派生密钥。对于一种完全通用的方式,它说您可以传递
[Function=>$code\u ref\u For\u key]
。你可以这样做:

子第一个\u两个\u插槽{ 我的$array\u ref=shift; 返回[@$array_ref[0,1]]; }

然后按照指定的顺序,它会将该数组传递到您的顺序并指定

my $heap = Heap::Simple->new( order     => \&byNumOrStr,
                              elements  => [Function => \&first_two_slots]
                             );

保留原始注释:(这与
Heap::Simple
调用顺序无关)


如果从
sort
调用
byNumOrStr
,则不要在其中分配
$a
$b
。这些值由排序设置。如果有东西进入
@
中,它可能不是您想要的。

嗯,很可能是
$a
$b
作为字符串传入。在赋值后尝试打印此变量

从文档中我可以看到,当您传递
元素=>[Array=>0]
时,除非数组中的第0项是数组,否则您将只比较数组第一个插槽中的值

[Array=>$index]
指示元素是数组引用,键位于索引$index。因此,现在元素不仅可以是键,还可以是关联的数据。 这意味着如果2.55像[2.55,…]一样在数组中,那么这就是作为
$a
$b
传入的内容

elements
条目告诉
H::S
您希望如何派生密钥。对于一种完全通用的方式,它说您可以传递
[Function=>$code\u ref\u For\u key]
。你可以这样做:

子第一个\u两个\u插槽{ 我的$array\u ref=shift; 返回[@$array_ref[0,1]]; }

然后按照指定的顺序,它会将该数组传递到您的顺序并指定

my $heap = Heap::Simple->new( order     => \&byNumOrStr,
                              elements  => [Function => \&first_two_slots]
                             );

保留原始注释:(这与
Heap::Simple
调用顺序无关)


如果从
sort
调用
byNumOrStr
,则不要在其中分配
$a
$b
。这些值由排序设置。如果有什么东西进入
@
中,它可能不是您想要的。

对二维数组进行排序实际上没有意义——排序时,有一个定义的顺序。有两个排序标准并不能使其成为二维列表。。。你的意思是你的数据是两个元素的列表吗?e、 g:

my $element = [ '0', 'string' ];
我认为文档中的示例1(“键和值是分开的”)适用于这里——您希望对引用进行排序,而不是对值本身进行排序。因此,请尝试使用
元素=>声明“Any”
,然后调整排序方法以匹配:

(我错了..看起来
elements=>[Array=>0]
是正确的,因为这些只是正在排序的普通的旧arrayRef

my $heap = Heap::Simple->new( order     => \&byNumOrStr,
                              elements  => [Array => 0],
                             );

sub byNumOrStr
{
    my ( $val1, $val2 ) = @_;

    my $result = 
        $val1->[0] <=> $val2->[0]  # the 0th element is a number
                    ||
        $val1->[1] cmp $val2->[1]; # the 1st element is a string

    # The docs say "this should return a true value if $key1 is smaller than $key2 and a false value otherwise."
    return $result == -1;
}
my$heap=heap::Simple->new(order=>\&byNumOrStr,
元素=>[Array=>0],
);
sub byNumOrStr
{
我的($val1,$val2)=@;
我的$result=
$val1->[0]$val2->[0]#第0个元素是一个数字
||
$val1->[1]cmp$val2->[1];#第一个元素是字符串
#文档说“如果$key1小于$key2,则返回真值,否则返回假值。”
返回$result==-1;
}

注:如中所述,Heap::Simple中的比较函数不希望返回值为-1、0或1,而是希望返回值为true或false。在从函数返回之前,需要转换比较结果。

对二维数组进行排序实际上没有意义——排序时,有一个已定义的顺序。有两个排序标准并不能使它成为一个二维列表……您的意思是您的数据是由两个元素组成的列表吗?例如:

my $element = [ '0', 'string' ];
我认为文档中的示例1(“键和值分开的地方”)适用于这里——您希望对引用进行排序,而不是对值本身进行排序。因此,请尝试使用
elements=>“Any”
,然后调整排序方法以匹配:

(我错了..看起来
elements=>[Array=>0]
是正确的,因为这些只是正在排序的普通的旧arrayRef

my $heap = Heap::Simple->new( order     => \&byNumOrStr,
                              elements  => [Array => 0],
                             );

sub byNumOrStr
{
    my ( $val1, $val2 ) = @_;

    my $result = 
        $val1->[0] <=> $val2->[0]  # the 0th element is a number
                    ||
        $val1->[1] cmp $val2->[1]; # the 1st element is a string

    # The docs say "this should return a true value if $key1 is smaller than $key2 and a false value otherwise."
    return $result == -1;
}
my$heap=heap::Simple->new(order=>\&byNumOrStr,
元素=>[Array=>0],
);
sub byNumOrStr
{
我的(