String 如何在匹配模式前后从文本文件中获取文本字符串?

String 如何在匹配模式前后从文本文件中获取文本字符串?,string,perl,String,Perl,我有一个名为mytext.txt的文本文件。我想在同一行的字符串Query:之前和之后获取此文件中的文本 mytext.txt: # P-value cutoff: 1 # Category cutoff: 4 # Output Format: Pretty --------------------------------------------------- 5' UGGGAGGAUGGGAUGGGAAAG 3' Transcript: Supercon

我有一个名为
mytext.txt
的文本文件。我想在同一行的字符串
Query:
之前和之后获取此文件中的文本

mytext.txt:

   # P-value cutoff: 1
    # Category cutoff: 4
    # Output Format: Pretty
    ---------------------------------------------------

    5' UGGGAGGAUGGGAUGGGAAAG 3' Transcript: Supercontig_2.10_1111019:1499-1519 Slice Site:1510
       ||oo||o| o|o|| o|||||
    3' ACUUUCUUUUCUUAAUCUUUC 5' Query: Seq_2171_593

    SiteID: Supercontig_2.10_1111019:1510
    MFE of perfect match: -26.00
    MFE of this site: -18.70
    MFEratio: 0.719230769230769
---------------------------------------------------

5' GUUUGGAAAGGCGGUUACGGGG 3' Transcript: Supercontig_2.10_1257006:252-273 Slice Site:264
   |oo||||||o||||||  o|oo
3' CGGACCUUUUCGCCAAGAUCUU 5' Query: Seq_5744_249

SiteID: Supercontig_2.10_1257006:264
以下是我尝试过的代码:

#!/usr/bin/perl
use warnings;
use strict;
use LWP::Simple;
use Modern::Perl;


my $word = "Query";

my $filename = $ARGV[0];
open(INPUT_FILE, $filename);
while (<INPUT_FILE>) {
chomp;
#for my $word (@words) {
        my ($before, $after) = $_ =~ /(\S+)(?:\t\Q$word\E\t)(\S+)/i;
        say "word: $word\tbefore: $before\tafter: $after";
#    }
}
另外,我可以使用各种其他方法(如unix one Liner)来实现这一点,但我正在学习perl,并希望在perl中实现这一点。谢谢您的帮助。

\S
与除空格字符以外的任何字符都匹配。除了换行符,您还需要其他字符,换行符就是
。您的word后面有一个
,您的正则表达式需要对此进行解释。最后,
\t
将只匹配制表符,您要查找的单词前后是否有实际的制表符

my ($before, $after) = m/(.+)(?:\t\Q$word\E:\t)(.+)/i;
作为旁注,
readline
操作符(
/
)默认使用特殊的文件句柄,它将打开并读取指定为参数的每个文件,因此您不必从
@ARGV
获取文件名并自己打开,您只需执行以下操作:

while (<<>>) { ... }
while(){…}
(如果您的Perl版本早于5.22,则必须使用
while()
,这不太安全,因为它允许执行作为参数传递的命令;出于类似的原因,您应该在自己打开文件时使用。)

\S
匹配除空格字符以外的任何字符。除了换行符,您还需要其他字符,换行符就是
。您的word后面有一个
,您的正则表达式需要对此进行解释。最后,
\t
将只匹配制表符,您要查找的单词前后是否有实际的制表符

my ($before, $after) = m/(.+)(?:\t\Q$word\E:\t)(.+)/i;
作为旁注,
readline
操作符(
/
)默认使用特殊的文件句柄,它将打开并读取指定为参数的每个文件,因此您不必从
@ARGV
获取文件名并自己打开,您只需执行以下操作:

while (<<>>) { ... }
while(){…}

(如果您的Perl版本早于5.22,您必须使用
while()
,这不太安全,因为它允许执行作为参数传递的命令;出于类似的原因,您应该在自己打开文件时使用。)

您的解决方案给我错误:word:Query:
before:after:在串联中使用未初始化值$before()或my_perl_script.pl第17行、第19559行的字符串。在连接(.)中使用未初始化值$after,或在my_perl_script.pl第17行,第19559行使用字符串。
听起来像是您意外地将该行代码放入字符串中。您的解决方案给我错误:word:Query:
before:after:在连接(.)中使用未初始化值$before,或在my_perl_script.pl第17行使用字符串,第19559行。在my_perl_script.pl第17行,第19559行的串联(.)或字符串中使用未初始化的值$after。
听起来好像是您无意中将该行代码放入了字符串中。