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

各種の名前を1つだけ取得するにはどうすればよいですか?これは私を夢中にさせています!!!

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 に答える