将 coderef 传递给 sort() 问题
passing a coderef to sort() problems
使用以下代码,我得到了截然不同的结果。
$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"}}
的输出真的很奇怪。如果它得到了错误的数据或 运行 错误的代码,它并不像您期望的那样乱码。它只是按错误的顺序排序。它已经改变了,而且是 "sorted",但是以一种非常奇怪的方式。
神秘的 $a
和 $b
有什么让我悲伤的吗?
他们(愚蠢地)被命名为 $sortFunc
的事实不应该是一个问题,不是吗?至少就 perl 而言是这样。
$a
和 $b
的范围规则有什么不同吗?
我已经 diff
编辑了代码,所以我知道它是一样的。
有hints/clues吗?我正在尝试将代码移动到哈希中(它运行的地方...... st运行gely)。
谢谢。
-埃里克
使用 sort BLOCK LIST
调用约定时,块应该 return 一个值,该值指示 $a
与 $b
的比较。但是,您的排序比较块 return 是一个代码引用 ($sortFunc{"date"}
)。你还不如用过
sort { 1 } @$rec;
替换
sort { $sortFunc{date} } @$rec;
和
sort { $sortFunc{date}->() } @$rec;
使用以下代码,我得到了截然不同的结果。
$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"}}
的输出真的很奇怪。如果它得到了错误的数据或 运行 错误的代码,它并不像您期望的那样乱码。它只是按错误的顺序排序。它已经改变了,而且是 "sorted",但是以一种非常奇怪的方式。
神秘的 $a
和 $b
有什么让我悲伤的吗?
他们(愚蠢地)被命名为 $sortFunc
的事实不应该是一个问题,不是吗?至少就 perl 而言是这样。
$a
和 $b
的范围规则有什么不同吗?
我已经 diff
编辑了代码,所以我知道它是一样的。
有hints/clues吗?我正在尝试将代码移动到哈希中(它运行的地方...... st运行gely)。
谢谢。
-埃里克
使用 sort BLOCK LIST
调用约定时,块应该 return 一个值,该值指示 $a
与 $b
的比较。但是,您的排序比较块 return 是一个代码引用 ($sortFunc{"date"}
)。你还不如用过
sort { 1 } @$rec;
替换
sort { $sortFunc{date} } @$rec;
和
sort { $sortFunc{date}->() } @$rec;