1

我正在尝试从包含字符串的文件中提取子字符串。该文件是这样的:

    >scaffold30     24194
    CTTAGCAGCAGCAGCAGCAGTGACTGAAGGAACTGAGAAAAAGAGCGAGCTGAAAGGAAGCATAGCCATTTGGGAGTGCCAGAGAGTTGGGAGG GAGGGAGGGCAGAGATGGAAGAAGAAAGGCAGAAATACAGGGAGATTGAGGATCACCAGGGAG.........
    .................

为了提取子字符串,我使用了一个包含子字符串开始和结束坐标的文件。我写的脚本是:

open my $coords_info, $coords_file or die "Could not open $coords_file: $!";
open my $chr_info, $chrom or die "Could not open $chrom: $!";
my $count = 0;


while(my $sline = <$chr_info>) {
    if ($sline!~ m/^>/) {
            chomp $sline;
            print $sline;
    foreach(my $cline = <$coords_info>) {
            my@data = split('\t', $cline);
            my $start = $data[0];
            my $end = $data[1];
            my $offset = $end - $start;
           $count++;
           my $sub = substr($sline, $start+1, $offset);
           print ">conserved $count\n";
           print $sub;
            }
    }
}

我的问题是我想将文件的所有字符串加载到 sline 变量中(而不是在每次迭代中逐行加载,然后使用 foreach 来提取子字符串。我知道这听起来是一个微不足道的问题,但可以你帮帮我好吗??谢谢...

4

2 回答 2

3

在一个字符串变量中读取所有文件:

{
   local $/ = undef;
   $variable = <$my_fh>;
}

将所有文件读入数组:

my @array = <$my_fh>;
于 2013-08-29T11:40:09.837 回答
2

看起来你想啜饮。

一篇Perl Maven帖子专门讨论了 Slurp 原理。它解释了如何从头开始实现它或使用CPAN 模块中的 File::Slurp模块。

另一种方法是使用Chromatic 解释的这种单线:

my $contents = do { local $/ = <$fh> };

Perl6::Slurp模块也是实现 Perl 6 slurp内置函数的便捷方式。

于 2013-08-29T11:48:07.793 回答