Perl解析器使用sort和uniq进行了很好的操作

时间:2014-03-21 20:07:42

标签: perl

嗨,我是Perl的新手。我无法理解运算符优先级。我在维基百科的Ruby页面中找到了一个程序

"Nice Day Isn't It?".downcase.split("").uniq.sort.join # => " '?acdeinsty"

我在Perl中尝试了同样的事情,但解析器行为很糟糕。我有以下程序

    use strict;
    use warnings;
    use List::MoreUtils qw(uniq distinct) ;

    my $hello = q/Nice Day Isn't It?/ ;

    print join ('', sort ( List::MoreUtils::uniq (split(//, lc $hello ))));  # &List::MoreUtils::uniq parses correctly and I need to include & before call.

    print "\n";

    print join('', sort( List::MoreUtils::uniq(split(//, lc $hello, 0))));

输出:

   '?acdeiiinnstty
 '?acdeinsty

此外,我试图了解Perl如何使用B :: Deparse模块解析代码,这里是输出

perl -MO=Deparse test.pl
use List::MoreUtils ('uniq', 'distinct');
use warnings;
use strict 'refs';
my $hello = q[Nice Day Isn't It?];
print join('', (sort List::MoreUtils::uniq split(//, lc $hello, 0)));
print "\n";
print join('', sort(&List::MoreUtils::uniq(split(//, lc $hello, 0))));
test.pl syntax OK

当我使用uniq时,我也会收到警告,因为我可能会与未来的保留关键字冲突。研究列表优先级和关联性的任何有用链接都将非常有用。我提到了perlop术语和列表操作符部分。

提前致谢。

1 个答案:

答案 0 :(得分:5)

查看sort的文档。如果你传递一个子名称,它将尝试使用它进行排序。

以下是不同的原因:

print join '', sort(uniq(split //, lc $hello));
# Prints:  ?acdeinsty

print join '', sort uniq(split //, lc $hello);
# Prints: nice day isn't it?

第二个相当于:

print join '', sort {uniq} (split //, lc $hello);

uniq函数将为所有测试返回0,声称每个字符都相等。因此sort将保持相同的顺序,将上述代码简化为:

print join '', split //, lc $hello;

sort使用下一个子作为比较器的一个技巧是在子名称前添加+符号(ty mpapec):

print join '', sort +uniq split //, lc $hello;