Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl中通过for循环控件打开和读取文件_Perl_Loops_For Loop - Fatal编程技术网

如何在perl中通过for循环控件打开和读取文件

如何在perl中通过for循环控件打开和读取文件,perl,loops,for-loop,Perl,Loops,For Loop,我的文件夹里有很多文件。我想根据参考文件的顺序打开并读取它们。 我的文件名: AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.2.fa AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.3.fa AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.4.fa . . . 参考文件结构: chr1 744 745 chr1 120

我的文件夹里有很多文件。我想根据参考文件的顺序打开并读取它们。 我的文件名:

AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa   
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.2.fa   
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.3.fa   
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.4.fa   
.  
.  
.   
参考文件结构:

 chr1   744     745  
 chr1   1208    1209  
 chr2   1250    1251   
 chr2   1454    1455  
 chr3   1676    1677  
 chr3   1683    1684  
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa
>1 dna:
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTATGTGAGAAGATAGCTGAA
CGCCTTGTCCACATCATCTTACTGCTGAGAGTTGAGCTCACCCTCAGTCCCTCACAGTTC   

AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.2.fa
>2 dna:
GAGAGCTGGCTTCTAGGCATGCTTCCTTTTGAGAGCTGAGGACAGGACAGAACCCTCCCG
CATCCTGCCTGACTGTAGACGTACCTGCTAACCTCCTCATGTTAGTGGCTGGGATAGATT
GTGGGAAAAGCATGTGTAAGCATTGGGCCTGAACTCCCGTGTATCTGAGTTGAATACAGC
GATTTCCAACATCCTTCTTCAATAGGAGTGTAGCTAGGTTCCAACTCCCATGTCCGAGTG
GGTAGCAGACATCTGCCTTCCATGCATACACACTTCTGAGAGTTGAGCTTATGGCCTGTA
ACCCTACCTCCTGCCTGCAGCTACCTTTTGCTTCCAAAAGTCCTAGGCTCGCTGCTTCAC
CAAAGTGTTGGGAGAGGTAACTGTTGTCTCCCGGCACACAAGACTAGTGCCTCCAAGCTC
AATCCAGCGATTTCCCAGTAATTCCTGGGTTAGACTGGTGCTACATACTAAGTTCCATAC
GTGAGTAGGTAGTTGAAAGCCTTGTCCAAAAACATCTTACTTCTGAGAGTTGAGCTCACC
CTCAGTCCCTCACAGTTCCACACTGCCTGCAGAGTGAGTTTCCCACGTCTTCATCAGAGA
CTTTTGCCAGAGGCTTCTGAGACGCAAGTTAACAATGCAAACAGGAGGGTATACCCAGGT
GCAGTAGATTGGTTATCTGGGAACCTCCTTACTCAGAATACTGTTACCTTCACACTGTCA
TAAGAATGCAGCTAGTTGAGAGCTGGCTTCTAGGCATGCTTCCCTGTGAGAGCTGAGGAC
输入文件结构:

 chr1   744     745  
 chr1   1208    1209  
 chr2   1250    1251   
 chr2   1454    1455  
 chr3   1676    1677  
 chr3   1683    1684  
AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa
>1 dna:
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTATGTGAGAAGATAGCTGAA
CGCCTTGTCCACATCATCTTACTGCTGAGAGTTGAGCTCACCCTCAGTCCCTCACAGTTC   

AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.2.fa
>2 dna:
GAGAGCTGGCTTCTAGGCATGCTTCCTTTTGAGAGCTGAGGACAGGACAGAACCCTCCCG
CATCCTGCCTGACTGTAGACGTACCTGCTAACCTCCTCATGTTAGTGGCTGGGATAGATT
GTGGGAAAAGCATGTGTAAGCATTGGGCCTGAACTCCCGTGTATCTGAGTTGAATACAGC
GATTTCCAACATCCTTCTTCAATAGGAGTGTAGCTAGGTTCCAACTCCCATGTCCGAGTG
GGTAGCAGACATCTGCCTTCCATGCATACACACTTCTGAGAGTTGAGCTTATGGCCTGTA
ACCCTACCTCCTGCCTGCAGCTACCTTTTGCTTCCAAAAGTCCTAGGCTCGCTGCTTCAC
CAAAGTGTTGGGAGAGGTAACTGTTGTCTCCCGGCACACAAGACTAGTGCCTCCAAGCTC
AATCCAGCGATTTCCCAGTAATTCCTGGGTTAGACTGGTGCTACATACTAAGTTCCATAC
GTGAGTAGGTAGTTGAAAGCCTTGTCCAAAAACATCTTACTTCTGAGAGTTGAGCTCACC
CTCAGTCCCTCACAGTTCCACACTGCCTGCAGAGTGAGTTTCCCACGTCTTCATCAGAGA
CTTTTGCCAGAGGCTTCTGAGACGCAAGTTAACAATGCAAACAGGAGGGTATACCCAGGT
GCAGTAGATTGGTTATCTGGGAACCTCCTTACTCAGAATACTGTTACCTTCACACTGTCA
TAAGAATGCAGCTAGTTGAGAGCTGGCTTCTAGGCATGCTTCCCTGTGAGAGCTGAGGAC
我的输出:
chr1a
chr1g
chr2c
chr2c
chr3 T
chr3 T

我可以使用bioperl找到位置,并一个接一个地打印出值(一个文件接一个文件)

然后我尝试打开并读取文件夹中的文件

my $dir = '/home/Documents/Folder/';
opendir(DIR, $dir) or die $!;
my @files = grep (/.fa$/, readdir(DIR));

for my $list(@files){  ##try to get the last number from file name##
my @lines = split /\./, $list}  
打开并读取我的参考文件

open my $POS, '<', 'CanFam3_SNP_POS.txt' or die $!;
然后,我尝试使用循环控件根据参考文件第1列的值打开和读取文件。例如chr1,AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.1.fa应该被读取和处理。如果从参考文件中读取chr2,请中断循环,然后打开并读取AAAAA_aaaaaaa.CCCCC3.1.bbb.DDDDD.2.fa,使用chr2处理该文件

open my $fh, '<', "/home/Documents/Folder/$sorted[$i]" or die $!;
while (my $line = <$POS>){

  chomp($line);

  if ($line =~ /chr$lines[5]/g){

  my @positions = split (/\t/, $line);

  print "$positions[0]","\t","$positions[1]","\t", substr($so->seq(), 
  $positions[1], $positions[2] - $positions[1]),"\n";

  last if ($line !~ /chr$lines[5]/g)

    }
 }

打开我的$fh,”这里的关键是只查看引用文件中给定行所需的特定FastA文件。从您发布的代码摘录来看,您似乎试图读取每一行的每一个文件(但没有做到这一点)

>请考虑以下内容:

#!/usr/bin/perl
use warnings;
use strict;
use autodie;
use feature qw/say/;
use File::Basename;

# Map the fasta files in a given directory to chr numbers.
my $fa_dir = '/home/Documents/Folder/';
my %fa_files =
  map { (split /\./, fileparse($_, '.fa'))[5] => $_ } glob("$fa_dir/*.fa");

open my $chrs, '<', 'CanFam3_SNP_POS.txt';
# Read each line of the reference file
while (<$chrs>) {
  chomp;
  # Split up the chr and offsets
  my @fields = split /\s+/, $_;  #/

  # Extract the chr number
  my $chr = $fields[0];
  $chr =~ s/^chr//;      #/
  warn "Unknown chr $chr!\n" and next unless exists $fa_files{$chr};

  # And read from the appropriate fasta file
  # You should probably use a library to read the file instead of
  # this mess, but I don't know which ones are good. Based on your code
  # you might be trying to use one already?
  open my $fa, '<', $fa_files{$chr};
  my $hdr = <$fa>;
  my $data = join "", <$fa>;
  $data =~ s/[^ACGT]+//sg;
  close $fa;

  # And display the requested part
  warn "Invalid offset for chr $chr\n" and next unless length($data) > $fields[1];
  my $range = substr $data, $fields[1], $fields[2] - $fields[1];
  say "chr$chr $range";
}
#/usr/bin/perl
使用警告;
严格使用;
使用自动模具;
使用功能qw/say/;
使用File::Basename;
#将给定目录中的fasta文件映射到chr编号。
my$fa_dir='/home/Documents/Folder/';
我的%fa_文件=
映射{(split/\./,fileparse($\',.fa'))[5]=>$\}glob(“$fa\'dir/*.fa”);
打开我的$chrs,'$fields[1];
my$range=substr$data、$fields[1]、$fields[2]-$fields[1];
说“chr$chr$range”;
}
它将给定目录中的每个
.fa
文件存储到哈希表中,由文件名的最后一个元素键入,该元素对应于引用文件中
chr
之后的内容。这使得查找需要读取的确切文件以打印出请求的片段变得容易


还请注意使用读取文件名,而不是
opendir()
/
readdir()
。基于扩展名进行过滤更简单,并且使用以独立于操作系统的方式仅获取文件名减去路径和扩展名。

如何将“chr1”、“chr2”等映射到fasta文件名?或者是吗?不,chr1和chr2…与文件名不匹配。只有当文件名与chr行不一致时,我才能从文件名的数字末尾识别。。。你怎么知道要查找什么文件?对于文件名,有些文件名为AAAAA_aaaaaaa.CCCCC3.1.bbb.DDDDD.X.fa;AAAAA_AAAAA.CCCCC3.1.bbb.DDDDD.MT.fa当我读取文件名末尾的数字时。我能理解这个文件是哪个chr的