在Perl中,“$ a”和“$ b”在sort()函数之外有什么特殊用途吗?

时间:2014-10-01 14:01:20

标签: perl global-variables lexical-scope

我问了一个关于使用" $ a"的问题。和" $ b"前几天在Perl的sort()中运作:

What exactly are "$a" and "$b" in Perl's "sort()" function?

我现在有一个跟进问题。是" $ a"和" $ b"仅由sort()使用或者是否有任何其他Perl函数利用这些特殊的全局变量?

即使没有其他功能使用它们,在sort()以外的任何情况下你会使用" $ a"或" $ b"?

编辑:

澄清:

简而言之,问题是可以" $ a"和" $ b"是否被sort()以外的其他人使用?

我很想知道他们可以使用的其他情况。我从未见过" $ a"或" $ b"被其他任何东西使用,并且想知道在sort()之外有任何其他特殊用途。

4 个答案:

答案 0 :(得分:6)

  

“$ a”和“$ b”可以使用sort()以外的其他内容吗?

正如已经解释的那样,$a$b没有什么特别之处(除了它们是预先声明的)。询问普通变量是否可以被某个函数使用而不是一个函数是没有意义的。以下$a被非sort的内容使用:

 $ perl -E'$a=123; say $a;'
 123

那就是说,这样做并不是一个好主意。最好use lexical variables,并声明$a$b作为词汇变量将使它们无法在sort(或在List :: Util的函数中)中使用而不会覆盖{ {1}}。

our ($a,$b);

答案 1 :(得分:2)

其他非内置函数,例如List :: Util :: reduce,也使用它们。

你能解释一下你为什么这么问吗?我觉得你正在寻找比这更重要的东西作为答案。

答案 2 :(得分:1)

$ a和$ b是sort函数分配给它所比较的​​两个元素的名称,它是分配给“compare()”用户提供的回调函数的参数。

您可以考虑在您设计的任何函数中使用“$ a”,“$ b”逻辑,向其提供函数作为参数,并为该函数提供两个(或更多)参数...

希望我足够清楚......

答案 3 :(得分:1)

简短的回答是&#34;不,除了在#include <stdio.h> #include <stdlib.h> #define N 5 int compare(const void *w1, const void *w2); int main(void) { char s1[N][15] = { { "azghtdffopAsAfp" }, { "poiuyjklhgADHTp" }, { "hgjkFfGgBnVUuKk" }, { "lokijuhygtfrdek" }, { "AaaAdDcCFfgGhHI" } }; char *wsk; int i, j; wsk = s1; for (i = 0; i < N; i++) { for (j = 0; j < 15; j++) { printf("%c", s1[i][j]); } printf("\n"); } for (i = 0; i < N; i++) qsort(s1[i], 15, sizeof(char), compare); printf("\n"); for (i = 0; i < N; i++) { for (j = 0; j < 15; j++) { printf("%c", s1[i][j]); } printf("\n"); } return 0; } int compare(const void *w1, const void *w2) { char *a1 = w1; char *a2 = w2; while (*a1 && *a2) { register r = tolower(*a1) - tolower(*a2); if (r) return r; ++a1; ++a2; } return tolower(*a1) - tolower(*a2); } &#34;的背景​​下,它们并不特殊。但是,我最近有机会在sort例程之外使用它们,这与你的问题密切相关。

我直接使用了sort$a,以便将$b函数用于单个比较。我使用sort确定了它们,并使用local块来包含范围:

do

my $cmp = do { local $a = $summary->{current_version}; local $b = $latest_version_on_usb; cmp_version(); }; 是一个专门用于cmp_version的子程序,所以通常它的用法如下:

sort

由于my @sorted_versions = sort cmp_version @old_versions; 知道它将由cmp_version调用,因此它会在sort$a内部完成所有工作。

我想在非排序上下文中重新使用我的排序子例程(我只想要输出单个&#34; $b&#34;比较好像{{1} }是一个真正的运算符,如$foo cmp_version $barcmp_version)是促使这一点的原因。这是我可以考虑使用<=>cmp的唯一原因,除非它在$a块或子例程中 - 事实上他们$b的上下文中是特殊的意味着在这种情境之外搞乱他们可能会最终咬你。