Я абсолютный новичок в Perl, а также программирование в целом (менее месяца).«Perl: добавьте элемент массива из одного массива в другой массив»
Я столкнулся с проблемой, которая должна быть решена, если я хочу решить большую проблему.
В принципе, у меня есть 2 массивы, которые выглядят следующим образом:
@array1 = ('NM_1234' , '1452' , 'NM_345' , '5008' , 'NR_6145' , '256');
@array2 = ('NM_5673' , '2' , 'NM_345' , '5' , 'NR_6145' , '10');
@array1
содержит идентификационные номера следуют длины. Идентификатор содержит нуклеотидные последовательности, а длина - длина последовательности.
@array2
содержит номера идентификаторов, за которыми следует число структур G-Quadruplex, поэтому некоторые последовательности содержат только 2 таких структуры, в то время как другие содержат 10 или более.
Основная проблема заключается в том, что я должен добавить к @array2
«номера длины» в @array1
(например, 5008, 256) для каждого совпадающего идентификационного номера.
Так, например, как NM_345 матчей в обоих массивах, мне нужно добавить к нему, так что конечный результат становится как NM_345,5,5008.
Аналогично с NR_6145 и других подобных матчей (Есть более 20000 идентификационные номера в @array2
)
До сих пор я был в состоянии написать код, который может просто искать тот же номер документа в обоих массивах , Вот код:
#Enter file name
print "Enter file name: ";
$in =<>;
chomp $in;
open(FASTA,"$in") or die;
@data = <FASTA>; #Read in data
$data = join ('',@data); #Convert to string
@data2 = split('\n',$data); #Explode along newlines
#Enter 2nd file name
print "\n\nEnter 2nd file name: ";
$in2=<>;
chomp $in2;
open(FASTA,"$in2") or die;
@entry =<FASTA>; #Read in data
$entry = join('',@entry); #Convert to string
@entry2 = split('\n',$entry); #Explode along newlines
my %seen;
for $item (@data2) {
if($item =~ /([0-9]+)/){
push @{$seen{$key}}, $item;#WHAT IS THIS DOING? HOW?
}
}
for my $item (@entry2) {
if ($item =~ /([0-9]+)/){
if (exists $seen{$key}) {
print $item,"\n";
};
}
}
exit;
Я полученный код, который находит один и тот же элемент из 2 массивов из этого решения здесь, так что полная заслуга Chas.Owens: https://stackoverflow.com/a/1064929/1468737. И, конечно, я не совсем понимаю, пока эта часть:
push @{$seen{$key}}, $item;#WHAT IS THIS DOING? HOW?
Это, как представляется, массив хэш-значение или что-то?
Итак, как теперь добавить элемент длины из @ array1 в @ array2? Мне нужно использовать команду сращивания, я думаю, но как?
Моего желаемый результат должен выглядеть следующим образом:
NM_345,5,5008 <br>
NM_6145,10,256<br>
etc
Мне также нужно сохранить этот вывод в файл, который потом будет проанализирован, чтобы увидеть, есть ли корреляция между длиной и числом G-квадруплексным.
Любая помощь или ввод будет оценен по достоинству.
Благодарим вас за то, что нашли время, чтобы пройти через мою проблему!
EDIT: Это изменение должно показать, как выглядят файлы данных. Они в основном являются файлами putput из других программ, которые я написал.
Мой первый файл, названный, Transcriptlength.фа, с более чем 40 000 идентификационные номера вдаваясь в @array1
выглядит следующим образом:
NR_037701
3353
NM_198399
2414
NR_026816
601
NR_027917
658
NR_002777
1278
Мой второй файл, названный Quadcount.AllGtranscripts.fa, с более чем 20,000id номера вдаваясь в @array2
, выглядит следующим образом:
NM_000014
1
NM_000016
3
NM_000017
19
NM_000018
2
NM_000019
3
NM_000020
30
NM_000021
1
NM_000022
2
NM_000023
5
NM_000024
1
NM_000025
15
NM_000029
5
Каков формат данных в каждом файле? – beresfordt
Есть ли причина, по которой вы не можете объявить эти массивы вверху, как хэши? Это сделало бы решение Im набирать намного легче. – PinkElephantsOnParade
Первый массив не может быть легко преобразован в хеш, я полагаю. По крайней мере, я построил свое решение, предполагая именно это: можно хранить несколько длин для каждой последовательности.) – raina77ow