Regex/Perl-对哈希表进行反向排序,将空格作为其中的第一个值,即使在Regex之后也是如此

Regex/Perl-对哈希表进行反向排序,将空格作为其中的第一个值,即使在Regex之后也是如此,regex,perl,Regex,Perl,所以我昨天发布了一个关于连字符的正则表达式的问题,然后我开始使用这个正则表达式模式: $comparator =~ s/(?!-)[[:punct:]]//g; 一切都很好。当比较器被读入时,我就开始咀嚼它,将regex模式应用于正在读入的文件中的字符串,应用如下循环: foreach my $comparison(split /\s+/, $comparator) 然后用%hash($word++)将这些值添加到哈希表中。接下来,我继续进行排序比较,打印出前25个值,从最大值到最小值,并使

所以我昨天发布了一个关于连字符的正则表达式的问题,然后我开始使用这个正则表达式模式:

$comparator =~ s/(?!-)[[:punct:]]//g;
一切都很好。当比较器被读入时,我就开始咀嚼它,将regex模式应用于正在读入的文件中的字符串,应用如下循环:

foreach my $comparison(split /\s+/, $comparator)
然后用%hash($word++)将这些值添加到哈希表中。接下来,我继续进行排序比较,打印出前25个值,从最大值到最小值,并使用这个值

foreach my $key  (sort { $hash{$a} <=> $hash{$b} } keys %hashes)  {  if the value is less than 25, print them: }
foreach my$key(排序{$hash{$a}$hash{$b}}key%hash){如果值小于25,则打印:}
它继续打印它们,但是我的第一个值始终为空,因此输出类似于

第一个值,发生5000次

第二个值cue出现在2300

第三个值是1200,亲爱的


在我看来,即使我的正则表达式模式告诉它不要计算空格,哈希仍然在计算空格。我几乎已经用psudocode描述了我的算法。如果
$comparator
以空格开头,则
拆分/\s+/,$comparator
结果的第一个元素将是空字符串,谢谢。然而,我无法解释为什么会有5000次

你能给出一个更真实的代码片段吗?代码中有一些明显的错误。(为了增加计数器,我们应该使用
$hash{$comparison}++
。为了从最大到最小排序,我们使用
$hash{$b}$hash{$a}
。hash应该是
%hash
,而不是
%hash
)我认为它们不是有效的。我想知道除了列出的代码之外,是否有什么错误。

来自perldoc:

作为另一种特殊情况,split模拟 当模式被省略或是文字时,命令行工具awk 由单个空格字符组成的字符串(如“”或“\x20”, 但不是,例如//)。在本例中,EXPR中的任何前导空格都是 在发生拆分之前删除,而将该模式视为 如果是/\s+/;特别是,这意味着任何连续的 空格(不仅仅是单个空格字符)用作分隔符。 但是,可以通过指定 模式//而不是字符串“”,因此只允许单个 空格字符作为分隔符。在早些时候,这是一个特殊情况 仅限于使用普通“”作为 split,在Perl 5.18.0及更高版本中,此特殊情况由任何 计算为简单字符串“”的表达式

您的输入字符串肯定包含多个连续空格,您最好在
'
上拆分,而不是
\s+

#!/usr/bin/perl
use Modern::Perl;
use Data::Dump qw(dump);

my $str = ' abc def a    b ';
my @l;
@l = split' ',$str;
dump@l;
@l = split/ /,$str;
dump@l;
@l = split/\s+/,$str;
dump@l;
输出:

("abc", "def", "a", "b")
("", "abc", "def", "a", "", "", "", "b")
("", "abc", "def", "a", "b")

在我看来,这就像是一个标签——Perl有时会在使用空格和正则表达式时表现得很奇怪。您是否尝试过
/[\s\t\r\n]+/
?@remus-我会为此制作一个新的正则表达式,还是会在我已有的正则表达式下面为$comparator添加另一个正则表达式模式?在您的拆分中,您有/s+/-替换它。(猜测,不知道它是否有效)@remus-不幸的是,它不起作用:(