Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 排序uniq(@stuff)不';t排序,不';重复数据消除_Perl_Sorting - Fatal编程技术网

Perl 排序uniq(@stuff)不';t排序,不';重复数据消除

Perl 排序uniq(@stuff)不';t排序,不';重复数据消除,perl,sorting,Perl,Sorting,有些代码让我变得抒情, 结果有点歇斯底里。 sorted我搜索的输出, 所有元素unique, 但结果如何?远离临床 问题代码 输出 修复 额外的一组括号可恢复奇偶校验: @test = sort( uniq( @test, qw/ d d c c b b a a / ) ); # a b c d 在-MO=Deparse中运行这两行可以揭示额外参数的影响-它迫使解释器将RHS视为排序列表,而不是排序子名称列表: # Doesn't work as intended (sort SUBNAM

有些代码让我变得抒情,
结果有点歇斯底里。
sort
ed我搜索的输出,
所有元素
uniq
ue,
但结果如何?远离临床

问题代码 输出 修复 额外的一组括号可恢复奇偶校验:

@test = sort( uniq( @test, qw/ d d c c b b a a / ) );  # a b c d
-MO=Deparse
中运行这两行可以揭示额外参数的影响-它迫使解释器将RHS视为
排序列表
,而不是
排序子名称列表

# Doesn't work as intended (sort SUBNAME LIST)
@test = (sort uniq @test, ('d', 'd', 'c', 'c', 'b', 'b', 'a', 'a'));

# Works as intended (sort LIST)
@test = sort(uniq(@test, ('d', 'd', 'c', 'c', 'b', 'b', 'a', 'a')));
我的问题
  • 为什么需要额外的一组括号?

    uniq
    返回一个列表,所以我希望

    sort uniq( @stuff );
    
    相当于

    sort LIST
    

uniq
被视为子名称,因为它是标识符或限定标识符,而不是函数名。未进行实际检查,以查看sub是否实际存在(尽管在这种情况下它会发现sub存在)


sort
后面需要跟一个函数名或不是标识符或限定标识符的东西,才能从
排序子名称列表
语法中取消其资格。

虽然很少使用,但
perldoc-f sort
中列出的第一种形式是
排序子名称列表
。i、 e.排序的可选第二个参数是用作排序比较器的函数名。当然,
列表
可能有括号,也可能没有括号,空白是免费的,所以

 sort uniq( @test, qw/ d d c c b b a a / )

表示使用函数
uniq
作为比较器对列表进行排序
(@test,qw/d d d c b a/)
。由于
uniq
的结果独立于
$a
$b
并且没有原型,因此它总是返回
undef
,排序将其视为0,排序通过不改变任何事物的顺序来响应这一断言,即所有事物都是相等的(因为它是一个稳定的排序,至少从5.8开始).

在Perl 5.8.8和5.16.3I上进行了测试。但问题是为什么?我在
uniq
的参数周围放置了paren,它应该返回一个列表,对吗?所以你问为什么
uniq
被视为子名称?嗯,这是一个,不是吗?@Zaid因为有“排序”,一个潜艇的名字,然后是一个列表。@ikegami-我明白你的意思。Perl将
uniq
视为
SUBNAME
(@stuff)
视为
LIST
,但为什么
排序(uniq(@stuff))
的解析方式不同呢?(这将更全面地回答OP的问题。)@Zaid,与
@a=(@b)没有什么不同
回答OP关于为什么需要额外参数的问题:
sort(…)
被解释为
sort
,带有OP想要的单个参数。如果没有参数,Perl会看到多参数版本的排序子名称列表。他们问为什么它被解释为
sort SUBNAME LIST
,而没有parens。@ikegami您正在回复一篇已经关闭了一个月的帖子。
sort LIST
 sort uniq( @test, qw/ d d c c b b a a / )