String 如何在perl中从文件中捕获特定字符串并将其转储到diff文件

String 如何在perl中从文件中捕获特定字符串并将其转储到diff文件,string,perl,parsing,String,Perl,Parsing,我有一个日志文件,其中包含各种测试条件的结果。看起来像 Starting TestCon1 Msg1:Criteria Result:pass Msg2:Criteria Result:fail Starting TestCon2 Msg1:Criteria Result:fail Msg2:Criteria Result:pass Starting TestCon3 Msg1:Criteria Result:pass 我想创建一个子例程,它只选择“Msg”,它与它们所属的TestCon一

我有一个日志文件,其中包含各种测试条件的结果。看起来像

Starting TestCon1
Msg1:Criteria
Result:pass
Msg2:Criteria
Result:fail

Starting TestCon2
Msg1:Criteria
Result:fail
Msg2:Criteria
Result:pass

Starting TestCon3
Msg1:Criteria
Result:pass
我想创建一个子例程,它只选择“Msg”,它与它们所属的TestCon一起失败。这将被转储到一个显示--> 失败的消息、结果及其所属的TestCon


我不知道从哪里开始,谁能告诉我从哪里开始呢?这里有一个起点:如果你将
$/
(行分隔符)设置为空字符串(
'
'
),那么每次调用
都会返回一个由空行分隔的块。因此,你可以编写如下代码:

sub subroutine_for_user2486369 {
    open my $filehandle, '<', 'file_for_user2486369.txt'
        or die "Couldn't open file: $@";
    local $/ = '';
    while (<>) {
        # now $_ is one of your blocks
        ... # code to examine $_, see if it's what you want, and print
        ... # your result
    }
    close $filehandle;
}
用于用户2486369的子例程{
打开我的$filehandle,“读取文件,使用正则表达式和变量

#!/usr/bin/env perl
my $testcon;
my $msg;
while (<STDIN>)
{
    if (/^Starting (.+)$/) { $testcon = $1 }
    elsif (/^Msg(\d+:\s*.+)$/) { $msg = $1 }
    elsif (/^Result:\s*fail$/) { print "$testcon\t$msg\n" }
}
!/usr/bin/env perl
我的$testcon;
我的$msg;
而()
{
如果(/^Starting(+)$/){$testcon=$1}
elsif(/^Msg(\d+:\s*+$/){$Msg=$1}
elsif(/^Result:\s*fail$/){打印“$testcon\t$msg\n”}
}

询问代码的问题必须表明对正在解决的问题的最低理解。包括尝试的解决方案、为什么不起作用以及预期的结果。从打开文件并阅读开始?