所以我對 perl 編程很陌生。我有兩個 txt 檔案,combined_gff.txt 和 pegs.txt。我想檢查 pegs.txt 的每一行是否是 combine_gff.txt 中任何行的子字串,并在名為 output.txt 的單獨文本檔案中僅輸出來自 combine_gff.txt 的那些行
但是我的代碼回傳空。請問有什么幫助嗎?
PS我應該提到這一點。combine_gff 和 pegs.txt 的內容都以行的形式存在。一行有一個字串。第二行有另一個字串。我只想從combined_gff 中提取其子字串存在于pegs.txt 中的行
#!/usr/bin/perl -w
use strict;
open (FILE, "<combined_gff.txt") or die "error";
my @gff = <FILE>;
close FILE;
open (DATA, "<pegs.txt") or die "error";
my @ext = <DATA>;
close DATA;
my $str = ''; #final string
foreach my $gffline (@gff) {
foreach my $extline (@ext) {
if ( index($gffline, $extline) != -1) {
$str=$str.$gffline;
$str=$str."\n";
exit;
}
}
}
open (OUT, ">", "output.txt");
print OUT $str;
close (OUT);
uj5u.com熱心網友回復:
第一個問題是exit。如果找到子字串,則永遠不會創建輸出檔案。
第二個問題是chomp:您不會從行中洗掉換行符,因此找到子字串的唯一方法是當來自 pegs.txt 的字串是來自 combine_gff.txt 的字串的后綴時。
即使解決了這兩個問題,演算法也會很慢,因為您將一個檔案的每一行與第二個檔案的每一行進行比較。如果它包含幾個不同的子字串,它也會多次列印一行(不確定這是否是你想要的)。
這是一種不同的方法:首先,讀取 pegs.txt 中的所有行并將它們組合成一個正則運算式(需要quotemeta以便子字串中的特殊字符在正則運算式中按字面解釋)。然后,逐行讀取combined_gff.txt,如果正則運算式匹配該行,則列印它。
#!/usr/bin/perl
use warnings;
use strict;
open my $data, '<', 'pegs.txt' or die $!;
chomp( my @ext = <$data> );
my $regex = join '|', map quotemeta, @ext;
open my $file, '<', 'combined_gff.txt' or die $!;
open my $out, '>', 'output.txt' or die $!;
while (<$file>) {
print {$out} $_ if /$regex/;
}
close $out;
我還切換到帶有詞法檔案句柄的open 的3 引數版本,因為它是規范方式(即使對于命名為>fileor 的檔案,3 引數版本也是安全的,rm *|并且詞法檔案句柄不是全域的,并且更容易作為引數傳遞給子例程)。此外,顯示實際錯誤比僅僅死于“錯誤”更有幫助。
uj5u.com熱心網友回復:
正如 choroba 所說,您不需要回圈內的“退出”,因為它結束了腳本的完整執行,您必須向前洗掉該行(LF 您通過 chomp 行執行此操作)才能找到匹配項。
按照你腳本的邏輯,我做了一個更正,效果很好。
#!/usr/bin/perl -w
use strict;
open (FILE, "<combined_gff.txt") or die "error";
my @gff = <FILE>;
close FILE;
open (DATA, "<pegs.txt") or die "error";
my @ext = <DATA>;
close DATA;
my $str = ''; #final string
foreach my $gffline (@gff) {
chomp($gffline);
foreach my $extline (@ext) {
chomp($extline);
print $extline;
if ( index($gffline, $extline) > -1) {
$str .= $gffline ."\n";
}
}
}
open (OUT, ">", "output.txt");
print OUT $str;
close (OUT);
希望對你有效。
韋爾喬
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/379334.html
