我在perl中编写了一个脚本,它读取当前目录中的每个文件并计算蛋白质和配体原子之间的距离。每当遇到结果为<=5
的条件时,它应该打破循环(last
)并将此文件移动到先前创建的另一个目录(mp
)中。出于某种原因,我对此脚本有疑问;它正确地计算距离,但不会将这些文件移动到另一个文件夹中。它没有给我任何严重的错误。我想弄清楚什么似乎是一个问题。
这是我一直在使用的脚本:
#!/usr/local/bin/perl
use strict;
use warnings;
use File::Glob;
mkdir "mp";
my $txt;
for my $txt ( glob '*.txt' )
{
open my $fh, '<', $txt;
my $out_fh;
my (@refer, @points);
my $part = 0;
my $dist;
while (my $line = <$fh>)
{
chomp($line);
$part++ if ($line =~ /^HETATM/);
my @array = (substr($line, 30, 8),substr($line,38,8),substr($line,46,8));
#print "@array\n";
if ($part == 0)
{
push @refer, [ @array ];
}
elsif ($part)
{
push @points, [ @array ];
}
my $atom;
foreach my $ref(@refer)
{
my ($x1, $y1, $z1) = @{$ref};
foreach my $atom(@points)
{
my ($x, $y, $z) = @{$atom};
my $dist = sqrt( ($x-$x1)**2 + ($y-$y1)**2 + ($z-$z1)**2 );
if ($dist <= 5)
{
print "Distance for calculation between $ref and $atom is $dist\n";
last;
system ("mv $fh mp");
}
}
}
}
}
我输入文件的内容如下所示:
ATOM 1593 HD21 LEU D 46 11.528 -8.800 5.301 1.00 0.00 H
ATOM 1594 HD22 LEU D 46 12.997 -9.452 4.535 1.00 0.00 H
ATOM 1595 HD23 LEU D 46 11.722 -8.718 3.534 1.00 0.00 H
HETATM 1597 N1 308 A 1 0.339 6.314 -9.091 1.00 0.00 N
HETATM 1598 C10 308 A 1 -0.195 5.226 -8.241 1.00 0.00 C
脚本在终端中给出的结果如下所示:
Distance for calculation between ARRAY(0x1c61fa8) and ARRAY(0x1c6f950) is 4.98553437456809
Distance for calculation between ARRAY(0x1c62098) and ARRAY(0x1c6ffe0) is 4.98962253081333
但它不会移动文件。
答案 0 :(得分:-1)
开头打开文件以便在perl中读取
open my $fh, '<', $txt;
然后在你的距离测试中,在最后一次之前,你应该关闭文件(使用文件句柄),然后移动文件(而不是你正在做的文件句柄)。
if ($dist <= 5)
{
print "Distance for calculation between $ref and $atom is $dist\n";
close($fh);
system("mv $txt mp");
last;
}