Regex 如何跟踪某些元素所属的分组?

Regex 如何跟踪某些元素所属的分组?,regex,perl,Regex,Perl,我为这个粗制滥造的头衔道歉;我不知道如何恰当地描述我所面临的问题 我有多个以下格式的制表符分隔文件: groupA donuts apples groupB car dog ball meter groupC apples donuts car groupD ball shirt pencil paper donuts 具有不同的行数 对于每一行,第一个单词是组名,而行的

我为这个粗制滥造的头衔道歉;我不知道如何恰当地描述我所面临的问题

我有多个以下格式的制表符分隔文件:

groupA    donuts     apples
groupB    car        dog        ball      meter
groupC    apples     donuts     car
groupD    ball       shirt      pencil    paper      donuts
具有不同的行数

对于每一行,第一个单词是组名,而行的其余部分是对象名。 我想做的是跟踪每个对象所属的组。 所以在这个例子中,我会发现
ball
groupD
groupB
的一部分,而
car
只是
groupC
的一部分
apples
groupA
groupC
的一部分,而
pencil
只是
groupD
的一部分

由于我正在读取的每个文件都有不同的行数/组数,因此实现这一点的最佳方法是什么

#!/usr/bin/perl
use strict;
use warnings;

my $path = "../GENELIST.symbols.csv";
open(PATH, $path) || die "cannot open csv\n";
my @groups = ();
while(my $line = <PATH>){
    if($line =~ /^(\w+)\t/){
        push(@groups, $1);
    }
}
close(PATH);
#at this point I have the name of all the groups in the particular file (`groupA`, `groupB`, `groupC`, `groupD`). 
#/usr/bin/perl
严格使用;
使用警告;
my$path=“../GENELIST.symbols.csv”;
打开(路径,$PATH)| | die“无法打开csv\n”;
我的@groups=();
while(我的$line=){
如果($line=~/^(\w+\t/){
推送(@groups,$1);
}
}
关闭(路径);
#此时,我得到了特定文件中所有组的名称(`groupA`、`groupB`、`groupC`、`groupD`)。

只需使用数组散列即可

要更熟悉此类结构,请查看:


多么简洁的模型啊!
use strict;
use warnings;

my %groups;

while (<DATA>) {
    my ($group, @cols) = split;
    push @{$groups{$_}}, $group for @cols;
}

use Data::Dump;
dd \%groups;

__DATA__
groupA    donuts     apples
groupB    car        dog        ball      meter
groupC    apples     donuts     car
groupD    ball       shirt      pencil    paper      donuts
{
  apples => ["groupA", "groupC"],
  ball   => ["groupB", "groupD"],
  car    => ["groupB", "groupC"],
  dog    => ["groupB"],
  donuts => ["groupA", "groupC", "groupD"],
  meter  => ["groupB"],
  paper  => ["groupD"],
  pencil => ["groupD"],
  shirt  => ["groupD"],
}