我想要一些幫助,這似乎是一個簡單的問題perl script。
我有兩個串列如下。兩者的行數相同,list1 的第一行對應于 list2 的第一行,以此類推。
串列1
car
ball
清單2
30
40
我想撰寫一個perl腳本來運行程式,該程式呼叫名稱以 list1 行開頭的檔案。在其中一個程式中,我必須考慮 list2 的內容,但僅針對 list1 中的對應行這樣做。
這是我嘗試過的:
perl test.pl list1 list2
測驗.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。
換句話說,我希望選項 -L 從jellyfish count“30”代表“汽車”和“40”代表“球”,但我做不到。
uj5u.com熱心網友回復:
這是解決方案:
#!/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::SlurpPerl 模塊。
兩個檔案內容都存盤在兩個不同的陣列中,分別稱為@file1_lines和@file2_lines。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506219.html
標籤:perl
下一篇:物件的默認Perl訪問器
