我有以下file.txt:
this._service.threadlist$
.map((threads) => {
return threads.filter((thead) => thread.isBookmarked);
})
.subscribe( threadlist => {
this.localThreadlistFiltered = threadlist;
});
我编写了一个脚本来计算重复次数,将它们从最高重复项排序到最低重复项并打印出来。喜欢:
AAAA
BBBB
AAAA
CCCC
EEEE
AAAA
脚本是:
AAAA : 3
BBBB : 1
CCCC : 1
EEEE : 1
但输出结果如下:
use v5.14;
use strict;
my %map;
chomp(my @chks = <FILE>);
foreach my $load (@chks) {
$map{$load} += 1;
}
foreach my $key (sort keys %map) {
say "$key : $map{$key} "
}
为什么它看不到$ key的值?
答案 0 :(得分:5)
答案是您的输入文件来自Windows平台,该平台使用CR LF作为行终止符。当在同一平台上使用Perl读取文件时,通常会在输入时删除CR,但如果使用Linux系统读取文件,则它将保留在原位。 Perl的chomp
将仅删除LF,将CR保留在每个哈希键值的末尾。这将导致在打印密钥时覆盖输出
解决方案是使用:crlf
PerlIO图层打开文件,或者使用chomp
以外的其他内容从输入末尾删除CR和LF
该程序必须有更多内容,因为您无法在任何地方打开FILE
。此外,您按散列键的词法顺序对输出进行排序,而不是值的数字顺序
以下是我编写代码的方法。 :crlf
图层会使CR LF行结尾在输入时转换为LF,chomp
现在将正常运行,只留下每行中的文本
use strict;
use warnings 'all';
my $filename = 'myfile.txt';
my @chks = do {
open my $fh, '<:crlf', $filename or die qq{Unable to open "$filename" for input: $!};
<$fh>;
};
chomp @chks;
my %map;
++$map{$_} for @chks;
for my $key ( sort { $map{$b} <=> $map{$a} } keys %map ) {
print "$key : $map{$key}\n";
}
AAAA : 3
CCCC : 1
BBBB : 1
EEEE : 1
正如我所说,您可以将:crlf
与chomp @chks
一起使用,而不是使用s/\R\z// for @chks
图层。 \R
将匹配任何系统中的任何行终止符:在本例中为CR LF字符对