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 文件获取数据时,我仍然找不到对数据进行分组的方法。
我的问题是,我需要什么才能对这些标签进行相应的分组?
简而言之,从一行数据中提取该索引(1或...)并使用它来形成正确的键并将该行添加到该键的 arraref 中,同样依赖于自动生存2
push @{$data{"state_$1"}}, $line if $line =~ /input_([0-9])/; \nRun Code Online (Sandbox Code Playgroud)\n在包含数据的行上,input_NN正则表达式提取 后的第一个数字input_,并将该行添加到 arrayref 的合适键处。要添加的键名称是使用捕获的号码和固定前缀构建的。密钥的第一次循环,在它被看到之前,因此它还不在哈希中,它是由称为autovivification的机制/功能生成的。\xe2\x80\xa0
然后还有一些细节——如果提前不知道真实数据中的内容而不是标记名称input和state,那么可以从第一行数据中提取它,然后按上面的方式使用。读取行时需要删除换行符。共
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;\nRun Code Online (Sandbox Code Playgroud)\n这假设键/数据具有固定前缀并且这些前缀是已知的(state, input)。
一个单行的例子
\nperl -MData::Dump -wnlE\'push @{$h{"state_$1"}}, $_ if /input_([0-9])/; }{ dd \\%h\' file\nRun Code Online (Sandbox Code Playgroud)\n其中file包含问题中给出的内容。这}{将启动该END 阶段——一旦所有行都被读取并完成处理,该RUN阶段就完成并且程序即将退出,之后的代码就会被执行。
\xe2\x80\xa0这是一个功能,当未定义的值(对象所在的位置)在“左值上下文”(需要“可修改的”)中取消引用时,将创建所需的对象。
\n上面的具体示例:我们state_1通过添加作为其值的 arrayref 来“使用”(取消引用)键(等等),push @{ $data{state_1} }, $value--但第一次没有这样的键!嗯,它是为我们即时制作的。
例如,参见The effective Perler 的一篇文章,然后还有更多这样的文章。这里有一些通用的例子和讨论,还有一个关于它何时生效或不生效的更棘手的例子。
\n\n\n\n在 Perl 中,存储位置(左值)根据需要自动生成,包括创建任何硬引用值以指向下一级存储。该分配
\n$a[5][5][5][5][5] = "quintet"可能会创建五个标量存储位置,以及指向四个新匿名数组(以保存最后四个标量位置)的四个引用(在前四个标量位置)。但自动激活的要点是你不必担心它。
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |