整个脚本的要点是:
步骤1)打开单个列文件并读取第一个条目。
步骤2)打开包含大量行和列的第二个文件,一次读取第一行,然后在该行中查找与第一个文件中的第一个条目匹配的任何内容。
step3)如果找到匹配,则“做一些有建设性的事情”,如果没有,转到第一个文件并进入第二个条目并重复步骤2和步骤3,依此类推......
这是脚本:
#!/usr/bin/perl
use strict; #use warnings;
unless(@ARGV) {
print "\usage: $0 filename\n\n"; # $0 name of the program being executed
exit;
}
my $list = $ARGV[0];
chomp( $list );
unless (open(LIST, "<$list")) {
print "\n I can't open your list of genes!!! \n";
exit;
}
my( @list ) = (<LIST>);
close LIST;
open (CHR1, "<acembly_chr_sorted_by_exon_count.txt") or die;
my(@spreadsheet) = (<CHR1>);
close CHR1;
for (my $i = 0; $i < scalar @list; $i++ ) {
print "$i in list is $list[$i]\n";
for (my $j = 1; $j < scalar @spreadsheet; $j++ ) {
#print "$spreadsheet[$j]\n";
if ( $spreadsheet[$j] ) {
print "will $list[$i] match with $spreadsheet[$j]?\n";
}
else { print "no match\n" };
} #for
} #for
我打算在行if ( $spreadsheet[$j] ) {
中使用正则表达式,但现在这个步骤遇到了问题。在第一次交互时,行print "will $list[$i] match with $spreadsheet[$j]?\n";
打印$list[$i]
确定但不打印$spreadsheet[$j]
。该行将在第二次和后续迭代中正确打印两个变量。我不明白为什么?
答案 0 :(得分:1)
$j = 1
看起来有问题,但也许你是故意跳过第一行。
这是一个经过测试的更加圆满的起点。如果它不起作用,那么你的输入文件就会发生一些事情。
请注意扩展的尾部空格删除。有时,如果在UNIX计算机上打开WINDOWS文件并使用chomp
,则可能会在文本中嵌入\r
,导致打印输出发生奇怪的事情。
#!/usr/bin/perl
use strict; #use warnings;
unless(@ARGV) {
print "\usage: $0 filename\n\n"; # $0 name of the program being executed
exit;
}
my $list = shift;
unless (open(LIST, "<$list")) {
print "\n I can't open your list of genes!!! \n";
exit;
}
open(CHR1, "<acembly_chr_sorted_by_exon_count.txt") or die;
my @spreadsheet = map { s/\s+$//; $_ } <CHR1>;
close CHR1;
# s/\s+$//; is like chomp but trims all trailing whitespace even
# WINDOWS files opened on a UNIX system.
for my $item (<LIST>) {
$item =~ s/\s+$//; # trim all trailing whitespace
print "==> processing '$item'\n";
for my $row (@spreadsheet) {
if ($row =~ /\Q$item\E/) { # see perlre for \Q \E
print "match '$row'\n";
}
else {
print "no match '$row'\n";
}
}
}
close LIST;