2016-02-25 3 views
0

Не уверен, что не так в моем скрипте perl. не в состоянии соответствовать конец строки с использованием регулярных выраженийPerl reg выражение для соответствия концу строки не работает

[[email protected] 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 

сценарий:

[[email protected] 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"; 
     } 
} 

Выход сценария:

[[email protected] 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 
+1

Может ли быть пробел перед разрывом? Попробуйте '/ log \ s * $ /' и проверьте, сохраняется ли ошибка. –

+0

@TimPietzcker: он сработал. но почему есть пробелы даже после chomp. –

+1

Насколько я знаю, 'chomp()' только удаляет символы новой строки, но никаких других символов пробелов. –

ответ

3

Оказывается, что есть некоторые пространства/символы табуляции до конца строки (chomp() удаляет только символы новой строки, но никаких других пробельных символов).

Разрешить эти завершающие пробельные символы (и, возможно, избежать матчей, как Blog с помощью word boundary anchor):

if ($log =~ /\blog\s*$/) 
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. Технически, независимо от значения $/ есть. Но $/ начать с подачи строки.