我有一个名为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";
# }
}
我想要的结果:
3' ACUUUCUUUUCUUAAUCUUUC 5' Seq_2171_593
3' CGGACCUUUUCGCCAAGAUCUU 5' Seq_5744_249
PS。我可以使用其他各种方法来完成此操作,例如unix one衬垫,但是我正在学习perl,并且希望在perl中完成此操作。感谢您的帮助。
答案 0 :(得分:2)
\S
character class与空格字符以外的其他任何字符匹配。您需要除换行符(.
)之外的所有内容。您的单词后面有一个:
,它的正则表达式需要说明。最后\t
仅匹配一个制表符,在您要查找的单词前后是否有实际的制表符?
my ($before, $after) = m/(.+)(?:\t\Q$word\E:\t)(.+)/i;
作为旁注,readline
运算符(<>
/ <<>>
)默认使用特殊的ARGV文件句柄,它将打开并从指定为参数的每个文件中读取,因此您不必从@ARGV
获取文件名并自己打开它,只需执行以下操作:
while (<<>>) { ... }
(如果您的Perl早于5.22,则必须使用while (<>)
,它不太安全,因为它允许执行作为参数传递的命令;出于类似的原因,您自己打开文件时应使用always use three-arg open。)< / p>