Foreach循环,其中包含对应行的两个列表(perl)

ddhy6vgd  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(150)

我想得到一些帮助,在什么似乎是一个简单的问题,在一个perl script
我有两个列表,它们的行数相同,list1的第一行对应于list2的第一行,依此类推。
列表1

car
ball

列表2

30
40

我想写一个perl脚本来运行调用文件名以list1的行开头的程序。在其中一个程序中,我必须考虑list2的内容,但这样做只针对list1中的对应行。
这就是我所尝试的:
perl test.pl list1 list2
test.pl:

#! /usr/bin/perl -w
use strict;

my $lib = $ARGV[0];
my $cov = $ARGV[1];

chomp $lib;
chomp $cov;

open(INPUT, "$lib");
my @lib = <INPUT>;
close(INPUT);

foreach my $i (@lib){
        chomp ($i);

        `samtools fasta $i\.sorted.bam > $i\.fasta`;
        `jellyfish count -m 80 -L $cov -s 275M -t 10 -C -o $i\.jf $i\.fasta`;
        `jellyfish histo $i\.jf > $i\.histo`;

}

第一个程序(samtools)正确执行,但第二个程序没有正确执行,因为它无法读取变量$cov中的内容。
换句话说,我希望jellyfish count中的L是“30”代表“car”,“40”代表“ball”,但我做不到。

uxhixvfz

uxhixvfz1#

解决方案如下:

#!/usr/bin/perl
use strict; use warnings;

use File::Slurp qw(read_file);
my ($file1, $file2) = ($ARGV[0], $ARGV[1]);

my @file1_lines = read_file($file1);
my @file2_lines = read_file($file2);

if ($#file1_lines == $#file2_lines) {
    foreach my $element (0..$#file1_lines){
        my $lib = $file1_lines[$element]; chomp $lib;
        my $cov = $file2_lines[$element]; chomp $cov;
        
        print "samtools fasta ".$lib."\.sorted.bam > ".$lib."\.fasta\n";
        print "jellyfish count -m 80 -L ".$cov." -s 275M -t 10 -C -o ".$lib."\.jf ".$lib."\.fasta\n";
        print "jellyfish histo ".$lib."\.jf > ".$lib."\.histo\n";
    }
} else {
    print "$file1 and $file2 doesn't have same number of lines\n";
}

这里我使用了File::Slurp将文件的全部内容读入一个数组,所以你的环境中必须有File::Slurp Perl模块。
这两个文件内容都存储在两个不同的数组中,分别称为@file1_lines@file2_lines

相关问题