我正在使用Perl逐行读取文件,如果满足条件则使用die
。条件是行必须以任何字母AGCT
开头,而行的其余部分只能包含字母AGCT
。
my $fasta = $ARGV[0];
open(FASTA, $fasta) || die("Couldn't read file $fasta\n");
local $/ = "\n>";
while (my $line = <>) {
if ( $line =~ /^[AGCT]/ && /[AGCT]/ ) {
die;
}
}
close FASTA;
我知道正则表达式中的语法是错误的,我尝试了很多变种但是无法得到它,有什么想法吗?
答案 0 :(得分:10)
您的正则表达式语法是正确的。您在if
条件下的Perl表达式是错误的。
if (
$line =~ /^[AGCT]/ # this tests $line
&& /[AGCT]/ # this defaults to $_
) {
您需要两次明确使用$line =~ //
。
此外,您的第二种模式并不能满足您的需求。您错过了*$
,并且包含起始字符也是有意义的。它应该读
/^[AGCT][AGCT]*$/
正如您所看到的,基本上您可以只使用一种模式并完成它。
if ( $line =~ /^[AGCT]+$/ ) { ... }
你可以通过做相反的模式进一步缩短它,并说它不应该匹配。
if ( $line !~ /[^AGCT]/ ) { ... }
由于双重否定(!~
和[^]
,这有点令人困惑。
在任何情况下,您都应首先chomp
输入。我会写这样的程序:
use strict;
use warnings;
# the \n removes the line number from die
open my $fh, '<', $fasta or die "Couldn't read file $fasta";
local $/ = "\n>";
while (my $line = <>) {
chomp $line;
die if $line =~ /[^AGCT]/;
}
如果任何行包含的内容不是A
,G
,C
或T
,该程序将会死亡。我相信这就是你想要做的。