我第一次使用Perl(使用TextWrangler),需要有关正则表达式的帮助!
我有一大串物种名称,DNA和其他文字。我想提取以下内容:
Homo sapiens
Pongo abelii
Macaca mulatta
现在,我已定义$ string并拥有此命令(对不起,如果我没有使用正确的术语,我是一个新手):
while($string =~ m/(Homo sapiens|Pongo abelii|Macaca mulatta)/g)
{
print "$1\n";
}
这是我得到的输出:
Homo sapiens
Homo sapiens
Pongo abelii
Macaca mulatta
Homo sapiens
Homo sapiens
Homo sapiens
Homo sapiens
Homo sapiens
Homo sapiens
如何获得每个物种名称的 ONE ?这让我疯了!!!
答案 0 :(得分:3)
除了你告诉我们之外,还有更多内容,或者你可以做到:
print "Homo sapiens\nPongo abelii\nMacaca mulatta\n";
但要回答你的问题:
my %seen;
while($string =~ m/(Homo sapiens|Pongo abelii|Macaca mulatta)/g)
{
print "$1\n" unless $seen{$1}++;
}
或者,更复杂的是,跟踪您正在寻找的内容,并在您找到它们时停止:
my %not_found = ( 'Homo sapiens' => 1, 'Pongo abelii' => 1, 'Macaca mulatta' => 1 );
while ( %not_found && $string =~ /(@{[ join( '|', map quotemeta, sort { length $b <=> length $a } keys %not_found) ]})/g ) {
print "$1\n";
delete $not_found{$1};
}
答案 1 :(得分:1)
从正则表达式的末尾删除g
修饰符。这代表&#34;全球&#34;并将匹配所有;没有它,只有第一个匹配。
答案 2 :(得分:0)
基本上,您希望删除重复项,因此请使用标准代码。
my %seen;
while ($string =~ /(Homo sapiens|Pongo abelii|Macaca mulatta)/g) {
print "$1\n" if !$seen{$1}++;
}