我正在使用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;
Run Code Online (Sandbox Code Playgroud)
我知道正则表达式中的语法是错误的,我尝试了很多变化,但无法得到它,任何想法?
sim*_*que 10
您的正则表达式语法是正确的.if条件中的Perl表达式是错误的.
if (
$line =~ /^[AGCT]/ # this tests $line
&& /[AGCT]/ # this defaults to $_
) {
Run Code Online (Sandbox Code Playgroud)
您需要$line =~ //两次都明确使用.
此外,你的第二个模式不能做你想要的.你错过了一个*$,并且包含起始角色也是有意义的.它应该读
/^[AGCT][AGCT]*$/
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,基本上您可以只使用一种模式并完成它.
if ( $line =~ /^[AGCT]+$/ ) { ... }
Run Code Online (Sandbox Code Playgroud)
你可以通过做相反的模式进一步缩短它,并说它不应该匹配.
if ( $line !~ /[^AGCT]/ ) { ... }
Run Code Online (Sandbox Code Playgroud)
这是因为双重否定(的有点混乱!~和[^]虽然.
无论如何,你应该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]/;
}
Run Code Online (Sandbox Code Playgroud)
如果任何行包含的东西是不是那个节目将死A,G,C或T.我相信这就是你想要做的.
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |