如何在Perl中选择行的一部分?

| 我有很多长文件,但我只对每个文件的部分信息感兴趣。到目前为止,我有一个修剪文件的代码,并为我提供了包含所需信息的行,当时只处理一个文件。 这是我正在使用的代码:
 #!/usr/bin/perl
use strict;
use warnings;
my $data;

open FILE, \"<$ARGV[0]\" or die \"cannot open file \'$ARGV[0]\'!\\n\\n\";

while ($data= <FILE>){
    chomp $data;

    if( $data=~m/\\<input type=\"hidden\" name=\"description\" value=\"454read\"><input type=\"hidden\" name=\"format\" value=\"fasta\"><input type=\"submit\" name=\"submitbutton\" value=\"FASTA\"/)
    {
        $data=~s/[^ACTGN]//g;
        print $data;
    }
}
这是我得到的输入:
 <input type=\"hidden\" name=\"sequence\" value=\"TTGTTGAGCTCGACGGTCATGACCCAGCTGGAGTCGGCACGGGCACCCGCGCGCTTCTGCCAGACGCCAATGTGGGACTTCTCGGTGTCGAGGC\"><input type=\"hidden\" name=\"name\" value=\"FUY784js_7HL\"><input type=\"hidden\" name=\"description\" value=\"454read\"><input type=\"hidden\" name=\"format\" value=\"fasta\"><input type=\"submit\" name=\"submitbutton\" value=\"FASTA\">
因此,我只需要两部分,TTGTT .... AGGC,这部分将始终为大写A,T,C,G或N,但是每个文件的长度可能有所不同。我还需要为此保存名称,在本例中为FUY784js_7HL,此名称每次都会更改。 理想的输出应如下所示:
FUY784js_7HL
TTGTTGAGCTCGACGGTCATGACCCAGCTGGAGTCGGCACGGGCACCCGCGCGCTTCTGCCAGACGCCAATGTGGGACTTCTCGGTGTCGAGGC
您是否知道我该怎么办?我有很多这样的文件。如果您能帮助我弄清楚如何使它适用于多个文件,我将不胜感激。 谢谢!     
已邀请:
        
perl -pe \'s/[^ACTGN]//g;\'
作为似乎有问题的位的代理,以上命令似乎有效,至少对于以
<input
开头的输入行和第二条输出行有效。 如果您的实际程序中没有任何其他打印件,那么我不确定它如何产生您所说的行。 实际上,那是一个谎言。我有: TTGTTGAGCTCGACGGTCATGACCCAGCTGGAGTCGGCACGGGCACCCGCGCGCTTCTGCCAGACGCCAATGTGGGACTTCTCGGTGTCGAGGCATA 由于末尾的FASTA值而返回。如果要限制为主要值:
perl -pe \'s/.*\"([ACTGN]+)\".*<input\\b[^>]*\\bname=\"name\"\\s[^>]*\\bvalue=\"([^\"]+)\".*/$2\\n$1/;\'
请注意,有关使用正则表达式解析XML的愚蠢和脆弱性的所有标准免责声明均适用。具体来说,重新命名名称和值属性是完全合法的,而此示例regex不允许这样做。     
        如果我正确理解了该问题,则似乎可以利用捕获组来满足您的需求。特别是因为您知道开始和结束但不知道中间,所以这样的事情应该起作用:
$data =~ /TTGTT(.+)AGGC/;
print $1;
在perldoc上查看有关捕获组的部分: http://perldoc.perl.org/perlre.html#Regular-Expressions     
        从已经发布的内容来看,我认为这将返回序列:
$data =~ /name=\"sequence\" value=\"([AGCT]*).*name=\"name\" value=\"([^\"])\"/;
print \"$2\\n$1\";
    

要回复问题请先登录注册