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

Sal*_*ork 1 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;
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,CT.我相信这就是你想要做的.

  • 或`$ line =〜/ [^ AGCT] /` (4认同)
  • @choroba 这略有不同,因为 simbabque 的正则表达式允许尾随换行符,而你的则不允许。此外,simbabque 的正则表达式不接受空字符串。 (2认同)
  • @choroba如果你打算这样做,它可能也是`$ line = ~y/AGCT // c` (2认同)
  • `$ line =〜/ ^ [AGCT] + $ /`与`$ line!〜/ [^ AGCT] /`不一样.后者匹配一个空字符串. (2认同)
  • 还有一个问题是“$line”可能会被“\n&gt;”终止。它甚至可能包括换行符。 (2认同)