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"],
}