Regex 正则表达式来拉动部分字符串

Regex 正则表达式来拉动部分字符串,regex,perl,Regex,Perl,我有一个作为数组读取的文本文件。我正在检查这个数组的每一行,并尝试在Perl脚本中提取该行的一部分,如果它与模式匹配的话 --- Message '/com/java/deploy/mess1' on folder1 'f1' is running. Additional thread

我有一个作为数组读取的文本文件。我正在检查这个数组的每一行,并尝试在Perl脚本中提取该行的一部分,如果它与模式匹配的话

  ---                                                                     
   Message '/com/java/deploy/mess1' on folder1 'f1' is running.                             

   Additional thread instances: '0'                                        
   Deployed: '11/12/13 1:54 AM' in Jar file '/deploy/ENV/folder1/mess1ENV11122013.jar'
   Last edited: '5/24/13 4:38 PM'.                                         
   Long description: ''                                                    

   ---                                                                     
   Message '/com/java/deploy/mess2' on folder1 'f1' is running.                             

   Additional thread instances: '0'                                        
   Deployed: '11/12/13 1:54 AM' in Jar file '/deploy/ENV/folder1/mess2ENV11122013.jar'
   Last edited: '5/24/13 4:38 PM'.                                         
   Long description: ''                                                    
   ----                                                                    
   Message '/com/java/deploy/mess3' on folder1 'f1' is running.                             

   Additional thread instances: '0'                                        
   Deployed: '11/12/13 1:54 AM' in Jar file '/deploy/ENV/folder1/mess3ENV11122013.jar'
   Last edited: '5/24/13 4:38 PM'.                                         
   Long description: '' 
我正在搜索mess1并试图从上面的数组中提取jar信息

foreach $line (@messdetials) {

  if ($line =~ mess1) {
    next if /^(\s)*$/;

    if (/in Jar file '(.*?)'/) {
      @jardetails = `$displaycommand -b $1`;
      print @jardetails;
    }

我希望从数组中提取
/deploy/ENV/folder1/mess1.jar
,并对其运行内部脚本,但我没有看到任何输出。

这将按照您的要求执行。它希望inpu文件的路径作为命令行上的参数,如下所示

perl findjar.pl /path/to/mylog.log
findjar.pl

use strict;
use warnings;

my $mess;
while (<>) {
  if ( /^\s*Message\s*'([^']*)'/ ) {
    $mess = $1;
  }
  elsif ( /in Jar file '([^']*)'/ ) {
    print $1, "\n" if $mess and $mess eq 'mess1';
  }
}

我能够通过使用以下代码片段实现这一点

 if ($line=~/$flowname/){$flag=1;}
 if($flag==1){
 if ($line =~/in Jar file '([^']*)'/){
 @jardetails = `$displaycommand -b $1`;
 print @jardetails;
 }
 $flag=0;}

这对我有用。

那么上面的每一行都是数组中的单个元素,还是每个块都是单个元素?(由--)分隔的块应该
if($line=~mess1){
be
if($line=~/mess1/){
?注意,我添加了前斜杠。@bloodyKnuckles:这相当于同一件事。它没有抱怨,因为OP显然没有
使用严格的
使用警告
@user3154754:我整理了你的代码,使其更具可读性。它有两个不匹配的大括号,因此无法编译。你没有这样做如果不是这样的话,那么在这里问一个问题来解决它是非常懒惰的。你还必须在你编写的每个Perl程序的顶部使用严格的和警告。@Hunter,我一直在看这个错误。我想我把每一行都当作数组中的一个元素来处理。但是我的脚本应该检查k如果行中有mess1、mess2或mess3,则获取对应mess的jar。
(((?:/\w+)*?/mess1\.jar)
似乎是一个更简单的搜索,因为jar文件似乎是以搜索词命名的。@HunterMcMillen:我假设事实并非如此,否则程序中没有什么意义。它可以简化为
print”/deploy/ENV/folder1/mess1.jar\n
很公平,认为值得一提。问题发布后没有反馈,很难说。我对原始帖子做了一点修改。jar文件并不是以搜索词命名的。我尝试了以下
foreach$line(@messdetials){next if($line=~/$mess1/);if($line=~/在Bar文件“([^']*)”/){print“$1\n”@jardetails=
$displaycommand-b$1
;print@jardetails;}
,但这不能将其保留到第一个块。它也将继续使用mess2和mess3 jar。
 if ($line=~/$flowname/){$flag=1;}
 if($flag==1){
 if ($line =~/in Jar file '([^']*)'/){
 @jardetails = `$displaycommand -b $1`;
 print @jardetails;
 }
 $flag=0;}