Как поменять имя в файле на другое в perl с хешем? - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть такой файл.

>;1;
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
>;2;
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
>;3;
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG

Я хотел бы изменить каждое число на соответствующую строку.

Я написал следующую программу на Perl, но я не знаю, что с ней не так.

%lista2 = (
    1  => "CAT00.3",
    2  => "CAT43.1",
    3  => "CAT40.3"
);

open(OA, ">file2.txt");

foreach $key ( keys %lista2 ) {

    open(SAL, "file.txt");

    while ( <SAL> ) {
        chomp;

        if( />/ ) {

            @w = split("\t");   
            $r = 0;
            s/\;//g;

            if ( /%lista2[i]/ ) {    
                print OA "$_ $lista2{$key}\n" ;
                $r = 1;
            }
        }
    }
}

close(SAL);
close(OA);

Я хочу получить это

>CAT00.3
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
>CAT43.1
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
>CAT40.3
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG

Но я не знаю, как это сделать.

1 Ответ

0 голосов
/ 28 апреля 2018

Ну, вы были в правильном направлении, я думаю. Но где-то на пути вы потеряли нас и, похоже, случайно пытались бежать в любом направлении. В вашем коде много неправильного.

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

        if ( /%lista2[i]/ ) {    
            print OA "$_ $lista2{$key}\n" ;

одна правильная попытка доступа к a имеет значение ($lista2{$key}) и совершенно неправильную (%lista2[i]), так близко друг к другу.

Тогда, поскольку вы печатаете только до OA, если ("/$lista2{$key}/"), вы полностью уничтожите все остальные строки в выводе. Ваш пример показывает, что вы этого не хотите.

Кроме того, измените вложенность цикла. Вместо того, чтобы открывать файл снова и снова, откройте его один раз, итерируйте по строкам и в каждой такой итерации итерируйте по ключам хеша. Вы не ошиблись, но открытие и закрытие файлов не обходится дешево, вы знаете. И если говорить о закрытии файлов: вы не закрыли SAL в теле вашего внешнего цикла, но именно здесь вы снова открываете его.

И используйте, по крайней мере, некоторую базовую обработку ошибок. Проверьте, не удалось ли open. Неправильное имя файла и программа завершается ошибкой без указания причины. Облегчи свою жизнь.

Зачем использовать chomp(), если позже вы все равно добавите \n к выводу и снова сделаете из него строку? Пропустить это.

Я не знаю, как интерпретировать эти строки:

        @w = split("\t");   
        $r = 0;
        s/\;//g;

Это какие-то остатки? Они не делают ничего полезного.

И последнее, но не менее важное: рекомендуется use strict; и, возможно, use warnings;, чтобы получить указатели на проблемные места.

Вот пример, который передает ваш пример.

#!/usr/bin/perl

use strict;
use warnings;

my %lista2 =
(
  1  => "CAT00.3",
  2  => "CAT43.1",
  3  => "CAT40.3"
);

if (!open(OA, ">file2.txt")) {
 die($!);
}
if (!open(SAL, "file.txt")) {
  die($!);
}

foreach my $line (<SAL>) {
  foreach my $key (keys(%lista2)) {
    if ($line =~ s/^>;$key;$/>$lista2{$key}/) {
      last;
    }
  }
  print(OA $line);
}

close(SAL);
close(OA);

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

Я также поднял уровень многословия, чтобы прояснить ситуацию.

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