Как разделить массив в Perl на основе шаблона - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь написать большой сценарий, но я застрял на части. Я хочу спрайт массива на основе ".."
Из скрипта я получил это:

print @coordinates;
gene            complement(872..1288)

мой желаемый вывод:

complement   872  1288

Я пытался:

   1) my @answer = split(.., @coordinates)
    print("@answer\n");   

   2) my @answer = split /../, @coordinates;

   3) print +(split /\../)[-1],[-2],[-3] while <@coordinates>

   4) foreach my $anwser ( @coordinates )
    {$anwser =~ s/../"\t"/;
    print  $anwser;}

    5) my @answer = split(/../,          "complement(872..1288)"); #to see if the printed array is problematic. 
    which prints:
      )          )          )          )          )          )          )          )          )          

    6) my @answer = split /"gene            "/, @coordinates; # I tried to "catch" the intire output's spaces and tabs
    which prints
    0000000000000000000000000000000001000000000100000000

Но ни один из них не работает. У кого-нибудь есть идеи, как решить эту проблему?
Ps, к сожалению, я не могу сейчас запустить свой скрипт на Linux, поэтому я использовал этот веб-сайт для запуска своего скрипта. Я надеюсь, что это не причина, почему я не получил желаемый результат.

Ответы [ 3 ]

2 голосов
/ 23 марта 2020
my $RE_COMPLEMENT = qr{(complement)\((\d+)\.\.(\d+)\)}msx;
for my $item (@coordinates) {
    my ($head, $i, $j) = $item =~ $RE_COMPLEMENT;
    if (defined($head) && defined($i) && defined($j)) {
        print("$head\t$i\t$j\n");
    }
}
1 голос
/ 23 марта 2020

split работает в скаляре, а не в массиве.

my $string = 'gene    complement(872..1288)';
my @parts  = split /\.\./, $string;
print $parts[0];  # gene    complement(872
print $parts[1];  # 1288)

Чтобы получить желаемый результат, вы можете использовать подстановку:

my $string = 'gene    complement(872..1288)';
$string =~ s/gene +|\)//g;
$string =~ s/\.\./ /;
$string =~ s/\(/ /;
0 голосов
/ 23 марта 2020

Желаемый эффект может быть достигнут с помощью

с использованием оператора tr для замены '(.)' => ''

с последующим разбиением строки данных на элемент в пространстве

сохранение только требуется часть массива

выходные элементы массива объединены с табуляцией

use strict;
use warnings;
use feature 'say';

my $data = <DATA>;

chomp $data;
$data =~ tr/(.)/ /;

my @elements = (split ' ', $data)[1..3];

say join "\t", @elements;

__DATA__
gene            complement(872..1288)

Или как альтернативное решение только с подстановками (без разбиения строки данных на массив)

use strict;
use warnings;
use feature 'say';

my $data = <DATA>;

chomp $data;

$data =~ s/gene\s+//;
$data =~ s/\)//;
$data =~ s/[(.]+/\t/g;

say $data;

__DATA__
gene            complement(872..1288)

Вывод

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