2016-03-23 11 views
0

Ich habe ein Array mit Sequenzen, wie unten gezeigt in esPrinting längste seq in einem Array unter Verwendung perl

my @a = qw(AAAA CGTGATG CGTGATTTGG); 

Ich möchte, um die Sequenz auszudrucken, die längsten in der Länge unter Verwendung von perl ist. So sollte ausgegeben werden

CGTGATTTGG 

#!/usr/bin/perl-w 
use strict; 
use warnings; 
use List::Util qw(min max); 

my %hash =(); 
my @a = qw(AAAA CGTGATG CGTGATTTGG); 

foreach(@a){ 
    print join("\t",$_,length($_)),"\n"; 
} 

Welche heraus druckt

AAAA 4 
CGTGATG 7 
CGTGATTTGG 10 

Ich möchte nur die seq mit der längsten Zeichenfolge drucken, die 10

ist, wie kann ich es tun

Dank

Antwort

2

Eine einfache Lösung, die die erste der langen zurückgibt est Strings:

use List::Util qw(reduce); 

my $longest = reduce { length($a) >= length($b) ? $a : $b } @a; 

Eine einfache Lösung, die alle der längsten Strings zurück:

use List::Util qw(max); 

my $max_len = max map { length($_) } @a; 
my @longests = grep { length($_) == $max_len } @a; 
+0

Dies ist die beste Antwort für diese spezielle Frage, da streng genommen die längste Sequenz zu unerwarteten Ergebnissen führt. – SES

-1

Verwenden Sie ein Schwartzian transform:

use strict; 
use warnings; 
use v5.10; 

my @sorted = map { $_->[0] } 
      sort { $a->[1] <=> $b->[1] } 
      map { [$_, length($_)] } 
      qw(AAAA CGTGATG CGTGATTTGG); 

say $sorted[-1]; 
say pop(@sorted); 
+0

Ich bin mir nicht sicher, dass ST hier hilft. Es hilft nur, wenn die Zeit, die es braucht, um die Länge eines Strings zu finden, das zweite Mal länger ist als die Zeit, die es dauert, um '-> [1]' zu machen (und das zählt nicht einmal den Overhead von ST). Es könnte die Dinge tatsächlich langsamer machen. – ikegami

+0

Diese Lösung skaliert nicht gut. Es ist O (N log N), während es eine O (N) -Lösung gibt. – ikegami

0

Hier ist der schnellste von der previous post zu diesem Thema :

sub longest { 
    my $max = -1; 
    my $max_ref; 
    for (@_) { 
     if (length > $max) { # no temp variable, length() twice is faster 
      $max = length; 
      $max_ref = \$_; # avoid any copying 
     } 
    } 
    $$max_ref 
} 
+1

Beachten Sie, dass dies nur eine der längsten (die erste) – ikegami

+0

Das OP festgestellt: ** "Ich möchte nur die Seq mit der längsten Zeichenfolge drucken" ** Das macht das. – dawg

+0

Wiederum nur, wenn nur ein String am längsten ist. Wenn mehr als ein Sing für die längste gebunden ist, gibt es stattdessen ** eine der längsten **. – ikegami

Verwandte Themen