嗨,我是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术语和列表操作符部分。
提前致谢。
答案 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;