用于匹配字符串结尾的Perl reg表达式不起作用

时间:2016-02-25 13:07:48

标签: regex perl

不确定我的perl脚本有什么问题。无法使用正则表达式

匹配行尾
[rmdev01@inches-rmdev01 SISPortal]$ forever logs
info:    Logs for running Forever processes
data:        script logfile
data:    [0] server /home/rmdev01/.forever/WusC.log
data:    [1] Server /home/rmdev01/.forever/2hai.log

脚本:

[rmdev01@inches-rmdev01 SISPortal]$ cat forever.pl
#! /usr/bin/perl

@logs=`forever logs`;

chomp(@logs);

foreach my $log (@logs)
{
        print "checking log at end of string $log\n";
        if ($log =~ /log$/)
        {
                print "$log\n";
        }
}

脚本输出:

[rmdev01@inches-rmdev01 SISPortal]$ ./forever.pl
checking log at end of string info:    Logs for running Forever processes
checking log at end of string data:        script logfile
checking log at end of string data:    [0] server /home/rmdev01/.forever/WusC.log
checking log at end of string data:    [1] Server /home/rmdev01/.forever/2hai.log

2 个答案:

答案 0 :(得分:3)

在字符串结尾之前似乎有一些空格/制表符(chomp()只删除换行符,但没有其他空白字符。)

允许那些尾随空白字符(并且可能使用word boundary anchor避免像Blog这样的匹配):

if ($log =~ /\blog\s*$/)

答案 1 :(得分:1)

chomp只删除换行符 [1] ,而您显然有其他尾随空格(例如回车符)。

s/\s+\z//删除所有尾随空格,因此使用它通常比使用chomp更好的实践。

#!/usr/bin/perl

use strict;
use warnings qw( all );

for (`forever logs`) {
    s/\s+\n//;
    print if /log$/;   # Or /\blog$/ as Tim Pietzcker suggested.
}
  1. 从技术上讲,无论$/的价值是多少。但$/开始时包含换行符。