1

我第一次使用 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

我如何获得每个物种名称中的一个?这让我快疯了!!!

4

3 回答 3

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};
}
于 2013-02-03T21:19:20.440 回答
1

从正则表达式的末尾删除g修饰符。这代表“全球”,将匹配所有;没有它,只有第一个匹配。

于 2013-02-03T21:16:27.920 回答
0

基本上,您想删除重复项,因此请使用标准代码来执行此操作。

my %seen;
while ($string =~ /(Homo sapiens|Pongo abelii|Macaca mulatta)/g) {
    print "$1\n" if !$seen{$1}++;
}
于 2013-02-03T21:25:28.613 回答