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。
听起来好像是您无意中将该行代码放入了字符串中。