我并不清楚是什么在FAMILYTAG
的多个名称列表示,但我已经把它们放在一起,假设他们是替代姓氏。
use strict;
use warnings;
my %names;
my %families;
while (<DATA>) {
next unless /^\d/;
my ($id, $name, $familytag, $effect) = split /\t/;
for my $tag (split /,/, $familytag) {
push @{ $names{$name} }, $tag;
push @{ $families{$tag} }, $name;
}
}
while() {
print "\nName: ";
chomp (my $name = <>);
last unless $name =~ /\S/;
print "\n";
if (my $tags = $names{$name}) {
for my $tag (@$tags) {
my $names = $families{$tag};
next unless @$names > 1;
printf "%s %s\n", $_, $tag for @$names;
}
}
else {
warn qq(No name "$name" found);
}
}
__DATA__
ID NAME FAMILYTAG EFFECT
001 John Black Positive
002 Kate Rhodes,Mich Positive
003 Aaron Sunders Negative
004 Shirley Rhodes Negative
005 Dexter Sunders,Hark Positive
输出
E:\Perl\source>ff.pl
Name: Kate
Kate Rhodes
Shirley Rhodes
Name: Aaron
Aaron Sunders
Dexter Sunders
Name: Mike
No name "Mike" found at E:\Perl\source\ff.pl line 31, <> line 3.
Name: Dexter
Aaron Sunders
Dexter Sunders
你的问题应该包括如何处理第三列中的多列逗号分隔值。另外,你在PerlMonks上的问题版本(顺便说一下,在多个论坛中同时提出同样的问题)在'Rhodes,Mich'有一个空间。您*必须*准确而准确地解释您的问题,否则您得到的答案将无法解决实际问题。 – Borodin 2012-04-27 22:48:50