在Perl正则表达式中使用'和'运算符

时间:2018-03-16 13:36:42

标签: regex perl

我正在使用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;

我知道正则表达式中的语法是错误的,我尝试了很多变种但是无法得到它,有什么想法吗?

1 个答案:

答案 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]/;
}

如果任何行包含的内容不是AGCT,该程序将会死亡。我相信这就是你想要做的。