我试图获取一组数据,并用另一组数据减去该数据中的每个值。
例如:
Data set one (1, 2, 3)
Data set two (1, 2, 3, 4, 5)
所以我应该得到(1 - (1 .. 5))
,然后是(2 - (1..5))
,等等
我目前有:
#!/usr/bin/perl
use strict;
use warnings;
my $inputfile = $ARGV[0];
open( INPUTFILE, "<", $inputfile ) or die $!;
my @array = <INPUTFILE>;
my $protein = 'PROT';
my $chain = 'P';
my $protein_coords;
for ( my $line = 0; $line <= $#array; ++$line ) {
if ( $array[$line] =~ m/s+$proteins+/ ) {
chomp $array[$line];
my @splitline = ( split /s+/, $array[$line] );
my %coordinates = (
x => $splitline[5],
y => $splitline[6],
z => $splitline[7],
);
push @{ $protein_coords->[0] }, %coordinates;
}
}
print "$protein_coords->[0]->[0]->{'z'} n";
my $lipid1 = 'MEM1';
my $lipid2 = 'MEM2';
my $lipid_coords;
for ( my $line = 0; $line <= $#array; ++$line ) {
if ( $array[$line] =~ m/s+$lipid1s+/ || $array[$line] =~ m/s+$lipid2s+/ ) {
chomp $array[$line];
my @splitline = ( split /s+/, $array[$line] );
my %coordinates = (
x => $splitline[5],
y => $splitline[6],
z => $splitline[7],
);
push @{ $lipid_coords->[1] }, %coordinates;
}
}
print "$lipid_coords->[1]->[0]->{'z'} n";
我试图取$protein_coords->[0]->[$ticker]->{'z'}
中的每一个值减去$lipid_coords->[1]->[$ticker]->{'z'}
中的每个值。
我的总体目标是在方程d = sqrt((x2-x1)^2+(y2-y1)^2-(z2-z1)^2)
中找到(z2-z1)^2
。我想,如果我能做一次,那么我也可以为X和Y做。从技术上讲,我试图找到PDB文件中每个原子与同一PDB中每个脂质原子之间的距离,并打印距离小于5A的ResID。
要迭代两个数组的所有组合,只需嵌入两个for循环:
use strict;
use warnings;
my @dataone = (1, 2, 3);
my @datatwo = (1, 2, 3, 4, 5);
for my $one (@dataone) {
for my $two (@datatwo) {
print "$one - $twon";
}
}
输出:
1 - 1
1 - 2
1 - 3
1 - 4
1 - 5
2 - 1
2 - 2
2 - 3
2 - 4
2 - 5
3 - 1
3 - 2
3 - 3
3 - 4
3 - 5
这将给出从集合1的每个元素中减去集合2的每个元素的结果,我相信这就是您所要求的方式。
#!/usr/bin/perl
use strict;
use warnings;
my @set1 = (1, 2, 3);
my @set2 = (1, 2, 3, 4, 5);
my @set3 = ();
for my $val (@set1) {
push @set3, map { $val - $_ } @set2;
}
local $" = ', ';
print "@set3n";
system 'pause';
结果将是一个包含(1-(1..5),2-(1..5),3-(1.5))的数组
脚本运行后@set3的内容:
0, -1, -2, -3, -4, 1, 0, -1, -2, -3, 2, 1, 0, -1, -2
所有其他蛋白质和脂质的东西都让我难以想象,但我希望这至少能有所帮助。现在,您应该有一个包含减法元素的数组,您可以使用它来获得剩余的结果!
编辑:
可以用这一行替换环路:)
my @set3 = map { my $v = $_; map { $v - $_ } @set2 } @set1;
地图是一个非常漂亮的功能!
最简单的方法是在处理文件二时进行计算:
for (my $line = 0; $line <= $#array; ++$line) {
if (($array[$line] =~ m/s+$lipid1s+/) | ($array[$line] =~ m/s+$lipid2s+/)) {
chomp $array[$line];
my @splitline = (split /s+/, $array[$line]);
my %coordinates = (x => $splitline[5],
y => $splitline[6],
z => $splitline[7],
);
push @{$lipid_coords->[1]}, %coordinates;
# go through each of the sets of protein coors in your array...
for my $p (@{$protein_coords->[0]}) {
# you can store this value however you want...
my $difference = $protein_coords->[0][$p]{z} - $coordinates{z};
}
}
}
如果我是你,我会使用某种形式的唯一标识符来访问每个组合的数据——例如,构建一个形式为$difference->{<protein_id>}{<lipid_id>} = <difference>
的哈希。