每当遇到特定结果时,将输入文件移动到另一个文件夹

时间:2018-01-16 14:15:36

标签: perl

我在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

但它不会移动文件。

1 个答案:

答案 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;
   }