【问题标题】:Perl Regex not finding pattern within scriptPerl 正则表达式未在脚本中找到模式
【发布时间】:2014-10-21 04:29:55
【问题描述】:

我正在读取日志文件的内容,对行执行正则表达式并将结果放入数组中,但由于某种原因没有输出。

use strict;
use warnings;

my $LOGFILE = "log.file";
my $OUTFILE = "out.file";

open(LOG, "$LOGFILE") or die ("Could not open $LOGFILE: $!\n");
open(TMP, ">", "$OUTFILE") or die ("Could not open $OUTFILE: $!\n");

my @data = (<LOG> =~ /<messageBody>(.*?)<\/messageBody>/sg);

print TMP "This is a test line. \n";

foreach (@data){
   print "@data\n";
   print "\n=======================\n";
}

close TMP;
close LOG;

我的输出是一个文件(out.file),唯一的内容是“这是一条测试线”。我知道正则表达式有效,因为我在提示符下尝试了它: -lne 'BEGIN{undef $/} while (/(.*?)/sg) {print $1} log.file > test.file

我做错了什么?

【问题讨论】:

    标签: regex perl file-io


    【解决方案1】:

    您的数据可能跨行。​​

    因此,您需要在使用您的正则表达式之前啜饮整个内容:

    my $logdata = do {local $/; <LOG>};
    
    my @data = $logdata =~ m{<messageBody>(.*?)</messageBody>}sg;
    

    【讨论】:

    • 太完美了。不过,我以前从未见过啜饮。谢谢!
    【解决方案2】:

    如果你想打印数据项,那么你应该这样做:

    foreach $item (@data){
       print TMP "$item\n";
       print TMP "\n=======================\n";
    }
    

    $item 将遍历所有数组项并写入 TMP 文件中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多