在perl中使用正则表达式匹配创建哈希

use*_*168 3 perl

可以说我有一个如下文件:

我想将所有十进制数存储在哈希中.

hello world 10 20
world 10 10 10 10 hello 20
hello 30 20 10 world 10
Run Code Online (Sandbox Code Playgroud)

我在看这个

这工作得很好:

> perl -lne 'push @a,/\d+/g;END{print "@a"}' temp
10 20 10 10 10 10 20 30 20 10 10
Run Code Online (Sandbox Code Playgroud)

那么我需要的是计算每个正则表达式的出现次数.

为此我认为最好将所有匹配存储在哈希中,并为每个键分配一个递增值.

所以我试过了:

perl -lne '$a{$1}++ for ($_=~/(\d+)/g);END{foreach(keys %a){print "$_.$a{$_}"}}' temp
Run Code Online (Sandbox Code Playgroud)

这给了我一个输出:

> perl -lne '$a{$1}++ for ($_=~/(\d+)/g);END{foreach(keys %a){print "$_.$a{$_}"}}' temp
10.4
20.7
Run Code Online (Sandbox Code Playgroud)

不管我错了,有人能纠正我吗?

我期望的输出是:

10.7
20.3
30.1
Run Code Online (Sandbox Code Playgroud)

虽然我可以在awk中执行此操作,但我只想在perl中执行此操作

输出的顺序也不是我关心的问题.

mel*_*ene 5

$a{$1}++ for ($_=~/(\d+)/g);
Run Code Online (Sandbox Code Playgroud)

这应该是

$a{$_}++ for ($_=~/(\d+)/g);
Run Code Online (Sandbox Code Playgroud)

并且可以简化为

$a{$_}++ for /\d+/g;
Run Code Online (Sandbox Code Playgroud)

这样做的原因是/\d+/g创建一个匹配列表,然后迭代for.当前元素在$_.我想$1会包含最后一场比赛留在那里的东西,但绝对不是你想要在这种情况下使用的东西.