Ну, вы были в правильном направлении, я думаю. Но где-то на пути вы потеряли нас и, похоже, случайно пытались бежать в любом направлении. В вашем коде много неправильного.
Например, забавно, как вы можете получить эти две строки
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);
На самом деле в ядре это можно упростить до замены шаблона. Нет разделения или что-то не нужно. Но шаблоны могут сбивать с толку, если вы новичок.
Я также поднял уровень многословия, чтобы прояснить ситуацию.