【问题标题】:passing a coderef to sort() problems将 coderef 传递给 sort() 问题
【发布时间】:2019-02-05 04:50:27
【问题描述】:

使用以下代码,我得到了截然不同的结果。

$val{"ENOTE"} = 05;
$val{"WATCH"} = 10;

my %sortFunc = ();

my $sortFunc = sub {
    my ($va, $vb);

    $va = $val{$$a{"etype"} . ":" . $$a{"emsg"}} // $val{$$a{"etype"}};
    $vb = $val{$$b{"etype"} . ":" . $$b{"emsg"}} // $val{$$b{"etype"}};

    #    printf("$$a{etype} gets $va\n");

    $$a{"year"} <=> $$b{"year"}
    || $$a{"month"} <=> $$b{"month"}
    || $$a{"day"} <=> $$b{"day"}
    || $$a{"sym"} cmp $$b{"sym"}
    || $va <=> $vb;
};

$sortFunc{"date"} = sub {
    my ($va, $vb);

    $va = $val{$$a{"etype"} . ":" . $$a{"emsg"}} // $val{$$a{"etype"}};
    $vb = $val{$$b{"etype"} . ":" . $$b{"emsg"}} // $val{$$b{"etype"}};

    #    printf("$$a{etype} gets $va\n");

    $$a{"year"} <=> $$b{"year"}
    || $$a{"month"} <=> $$b{"month"}
    || $$a{"day"} <=> $$b{"day"}
    || $$a{"sym"} cmp $$b{"sym"}
    || $va <=> $vb;
};

当我打电话给他们时,我得到了截然不同的结果。

@newsortrec = sort $sortFunc (@$rec);
@newsortrec = sort {$sortFunc{"date"}} (@$rec);

$sortFunc 的调用按我的预期工作,并且我已经验证了它的输出。 {$sortFunc{"date"}} 的输出真的很奇怪。如果它获得了错误的数据或运行了错误的代码,它不会像您期望的那样胡言乱语。它只是按错误的顺序排序。它发生了变化,并且被“排序”了,但是以一种非常奇怪的方式。

神秘的$a$b 有什么让我伤心的事吗?

他们(愚蠢地)被命名为$sortFunc这一事实不应该是一个问题,不是吗?至少就 perl 而言。

$a$b 的范围规则有什么不同吗?

我已经diffed 了代码,所以我知道它是一样的。

任何提示/线索?我正在尝试将代码移动到哈希中(它运行的地方......奇怪)。

谢谢。

-埃里克

【问题讨论】:

  • 我留下了一段代码。 $va$vb 是数字。 $val{"ENOTE"} = 05;,例如。对困惑感到抱歉。 -E

标签: perl coderef


【解决方案1】:

使用sort BLOCK LIST 调用约定时,该块应返回一个值,该值指示$a$b 的比较情况。但是,您的排序比较块返回一个代码参考 ($sortFunc{"date"})。你还不如用过

 sort { 1 } @$rec;

替换

 sort { $sortFunc{date} } @$rec;

 sort { $sortFunc{date}->() } @$rec;

【讨论】:

  • 好的。那行得通。为什么$sortFunc 不需要同样的处理?为什么$sortFunc{date}(没有 BLOCK 括号)不起作用(它甚至没有运行)?就 yuks 而言,BLOCK 是什么“类型”?看起来,coderef 有时会起作用。无论如何,您的更改都有效,非常感谢您。 -埃里克
  • 是不是因为$sortFunc作为coderef在符号表中,而散列的值通常根本不在符号表中?
  • 因为它不遵循sort BLOCK LIST 调用约定。例如,sort { $sortFunc } ... 会给您与sort { $sortFunc{date} } ... 相同的结果。 sort $sortFunc ... 不匹配任何记录在案的调用约定,但作为 sort SUBNAME LIST 工作。
  • Re "对于 yuks,BLOCK 是什么“类型”?",块是“{ STATEMENTS }”形式的句法元素
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 2012-12-09
  • 2021-04-19
  • 2012-11-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多