Как выделить части строки в Perl? - PullRequest
1 голос
/ 27 мая 2011

У меня много длинных файлов, но меня интересует только часть информации каждого из них.Пока у меня есть код, который обрезает файл и дает мне строку, содержащую нужную мне информацию, работая с одним файлом за раз.

Это код, который я использую:

 #!/usr/bin/perl
use strict;
use warnings;
my $data;

open FILE, "<$ARGV[0]" or die "cannot open file '$ARGV[0]'!\n\n";

while ($data= <FILE>){
    chomp $data;

    if( $data=~m/\<input type="hidden" name="description" value="454read"><input type="hidden" name="format" value="fasta"><input type="submit" name="submitbutton" value="FASTA"/)
    {
        $data=~s/[^ACTGN]//g;
        print $data;
    }
}

И это ввод, который я получаю:

 <input type="hidden" name="sequence" value="TTGTTGAGCTCGACGGTCATGACCCAGCTGGAGTCGGCACGGGCACCCGCGCGCTTCTGCCAGACGCCAATGTGGGACTTCTCGGTGTCGAGGC"><input type="hidden" name="name" value="FUY784js_7HL"><input type="hidden" name="description" value="454read"><input type="hidden" name="format" value="fasta"><input type="submit" name="submitbutton" value="FASTA">

Из этого мне нужны только две части, TTGTT .... AGGC, эта часть всегда будет в верхнем регистре A, T, C, G илиN, однако длина может отличаться в каждом файле.Мне также нужно сохранить имя для этого, которое в данном случае FUY784js_7HL, это имя будет меняться каждый раз.

Идеальный результат должен выглядеть следующим образом:

FUY784js_7HL
TTGTTGAGCTCGACGGTCATGACCCAGCTGGAGTCGGCACGGGCACCCGCGCGCTTCTGCCAGACGCCAATGTGGGACTTCTCGGTGTCGAGGC

У вас есть какие-либоИдея, как я могу это сделать?У меня много таких файлов.Я буду признателен, если кто-нибудь из вас поможет мне разобраться, как заставить это работать для нескольких файлов.

Спасибо!

Ответы [ 3 ]

1 голос
/ 27 мая 2011
perl -pe 's/[^ACTGN]//g;'

В качестве прокси для бита, который кажется проблематичным, приведенная выше команда работает, по крайней мере, со строкой ввода, начинающейся с <input, и второй строкой вывода.

Если у вас нет других отпечатков в вашей настоящей программе, я не уверен, как она могла бы воспроизвести строку, которую вы сказали, что она сделала.

На самом деле, это была ложь. Я получил:

TTGTTGAGCTCGACGGTCATGACCCAGCTGGAGTCGGCACGGGCACCCGCGCGCTTCTGCCAGACGCCAATGTGGGACTTCTCGGTGTCGAGGCATA

назад из-за значения FASTA в конце. Если вы хотите ограничиться основным значением:

perl -pe 's/.*"([ACTGN]+)".*<input\b[^>]*\bname="name"\s[^>]*\bvalue="([^"]+)".*/$2\n$1/;'

Обратите внимание, что применяются все стандартные отказы от ответственности за глупость и хрупкость синтаксического анализа XML с помощью регулярных выражений. В частности, совершенно законно переупорядочивать атрибуты name и value, и этот пример регулярного выражения не позволяет этого.

0 голосов
/ 27 мая 2011

Из того, что было опубликовано, я думаю, что это вернет последовательность:

$data =~ /name="sequence" value="([AGCT]*).*name="name" value="([^"])"/;
print "$2\n$1";
0 голосов
/ 27 мая 2011

Если я правильно понимаю проблему, похоже, что использование групп захвата отвечает вашим потребностям. Тем более, что вы знаете начало и конец, но не знаете середину, что-то вроде этого должно работать:

$data =~ /TTGTT(.+)AGGC/;
print $1;

Ознакомьтесь с разделом о группах захвата в perldoc: http://perldoc.perl.org/perlre.html#Regular-Expressions

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...