2016-11-21 1 views
-4
speichern

Ich habe eine Datei, die eine Reihe von Zeilen hat, die aus A, C, G und T bestehen. Ich möchte die Länge dieser Linien finden, eine Liste der kritischen Längen erstellen (die Längen nacheinander addieren) und sie in ein Array setzen. Bisher habe ich:Wie ich culmultitive Länge von Strings in ein Array mit Perl

#! /usr/bin/perl -w 
use strict; 

my $input = $ARGV[0]; 
my %idSeq; 
my (@ID, @Seq); 

open (my $INPUT, "<$input") or die "unable to open $input"; 

while (<$INPUT>) { 
    if (my $culm_length = /^([AGCT]\w+)\n$/) { 
    length($culm_length) = $_; 
    push (@Seq, $1); 

    }  
} 
bla bla bla.... 

Bisher denke ich, was ich geschrieben habe gibt mir eine Reihe von der Länge der einzelnen Zeilen. Ich will die kultischen Längen, irgendwelche Ideen?

+3

'Länge ($ culm_length) ändert = $ _;'? Das kompiliert gar nicht! – ikegami

+0

Trivia: Die 4 lvalue ops: 'Schlüssel',' substr', 'vec' und' $ # a'. – ikegami

Antwort

2

Mit Bezug auf Ihre vorherige Frage How do I read strings into a hash in Perl, die auf Eis gelegt wurde, denke ich vielleicht totale der Längen der Linien

Ich würde schreiben Sie es auf diese Weise eine laufen wollen. Es hält die laufende Summe in $total und schiebt seinen Wert auf die @lengths Array jedes Mal, es

use strict; 
use warnings 'all'; 

my ($input) = @ARGV; 

open my $fh, '<', $input or die qq{unable to open "$input" for input: $!}; 

my @lengths; 
my $total = 0; 

while (<$fh>) { 
    push @lengths, $total += length $1 if /^([ACGT]+)/; 
} 
+0

Dies ist eine gute Interpretation, wenn ein Index oder eine Abfrage auf der Absolutionsposition bekannter Positionen basiert. – BenPen

1
#!/usr/bin/perl -w 
use strict; 

my $length = 0; 
while (<>) { 
    $length += length($1) if /^([AGCT]\w+)$/; 
} 

my @length = $length; # But why would you want to do this?! 

... 
+0

Sollte das nicht sein: $ length + = length ($ _) if/^ ([AGCT]) + \ w + $ /; Damit trimmen Sie den nachgestellten Leerraum im gespeicherten Feld. – BenPen

+0

@BenPen, Nein, sie fragen nach den kumulativen Längen der * Zeilen *. (Ich weiß nicht, warum sie "kumulative Längen" statt "kumulativer Länge" sagen.) – ikegami

+0

@BenPen, '\ w +' passt nicht zum Leerraum. Du würdest '/^([AGCT] + \ w +) \ s * $ /' verwenden, um ignorierbares schließendes Leerzeichen zu erlauben (oder du würdest zuerst mit etwas wie "s/\ s + \ z //;" . – ikegami

Verwandte Themen