如何根据 Perl 中的特定正则表达式将文件中的值分组到哈希中?

Mat*_*ias 4 perl hash grouping

我有一个 .txt 文件,其中一列中包含数据,如下所示:

state_1
state_2
state_3
input_11
input_12
input_13
input_21
input_22
input_31
Run Code Online (Sandbox Code Playgroud)

我想根据这些标签的名称和编号将它们分组为哈希:

state_1:              # For state_1, we have all "input1x" data tags
  -input_11
  -input_12
  -input_13
state_2:              # For state_2, we have all "input2x" data tags
  -input_21
  -input_22
state_3:              # For state_3, we have all "input3x" data tags
  -input_31
Run Code Online (Sandbox Code Playgroud)

我尝试使用本例中的push函数来尝试将值作为数组强制放入哈希中,但我一直在寻找一种循环方法并根据正则表达式获取所需的哈希。push @{ $state{$inputs} }, $_;

我还研究了如何根据 regex 对数据进行分组,但是当我从 .txt 文件获取数据时,我仍然找不到对数据进行分组的方法。

我的问题是,我需要什么才能对这些标签进行相应的分组?

zdi*_*dim 8

简而言之,从一行数据中提取该索引(1或...)并使用它来形成正确的键并将该行添加到该键的 arraref 中,同样依赖于自动生存2

\n
push @{$data{"state_$1"}}, $line  if $line =~ /input_([0-9])/; \n
Run Code Online (Sandbox Code Playgroud)\n

在包含数据的行上,input_NN正则表达式提取 后的第一个数字input_,并将该行添加到 arrayref 的合适键处。要添加的键名称是使用捕获的号码和固定前缀构建的。密钥的第一次循环,在它被看到之前,因此它还不在哈希中,它是由称为autovivification的机制/功能生成的。\xe2\x80\xa0

\n

然后还有一些细节——如果提前不知道真实数据中的内容而不是标记名称inputstate,那么可以从第一行数据中提取它,然后按上面的方式使用。读取行时需要删除换行符。共

\n
use warnings;\nuse strict;\nuse feature \'say\';\n\nuse Data::Dump qw(dd);   # to see complex data; or, use core Data::Dumper\n\nmy %data;\n\nwhile (<>) {  # reads line by line the files given on command line\n    chomp;\n\n    push @{$data{"state_$1"}}, $_  if /input_([0-9])/;\n}\n\ndd \\%data;\n
Run Code Online (Sandbox Code Playgroud)\n

这假设键/数据具有固定前缀并且这些前缀是已知的(state, input)。

\n
\n

一个单行的例子

\n
perl -MData::Dump -wnlE\'push @{$h{"state_$1"}}, $_ if /input_([0-9])/; }{ dd \\%h\' file\n
Run Code Online (Sandbox Code Playgroud)\n

其中file包含问题中给出的内容。这}{将启动该END 阶段——一旦所有行都被读取并完成处理,该RUN阶段就完成并且程序即将退出,之后的代码就会被执行。

\n
\n

\xe2\x80\xa0这是一个功能,当未定义的值(对象所在的位置)在“左值上下文”(需要“可修改的”)中取消引用时,将创建所需的对象。

\n

上面的具体示例:我们state_1通过添加作为其值的 arrayref 来“使用”(取消引用)键(等等),push @{ $data{state_1} }, $value--但第一次没有这样的键!嗯,它是为我们即时制作的。

\n

例如,参见The effective Perler 的一篇文章,然后还有更多这样的文章。这里有一些通用的例子和讨论,还有一个关于它何时生效或不生效的更棘手的例子。

\n

来自Perllossary 的条目

\n
\n

在 Perl 中,存储位置(左值)根据需要自动生成,包括创建任何硬引用值以指向下一级存储。该分配$a[5][5][5][5][5] = "quintet"可能会创建五个标量存储位置,以及指向四个新匿名数组(以保存最后四个标量位置)的四个引用(在前四个标量位置)。但自动激活的要点是你不必担心它。

\n
\n


归档时间:

查看次数:

154 次

最近记录:

3 年,10 月 前