2015-05-06 5 views
0

Я пытаюсь постоянно затягивать растущий файл и использовать регулярное выражение для извлечения информации, когда новые строки добавляются в файл, но $1 не похоже, нравится.

Код

#!/usr/bin/perl 
$| = 1; 
use strict; 
use warnings; 

use File::Tail; 

my $file=File::Tail->new(
     name=>"sample.txt", 
     maxinterval=>1, 
     interval=>0.05); 

while (defined(my $line=$file->read)) 
{ 
     chomp($line); 
     print "$line\n"; 
     if ($line =~ m/ls/) 
     { 
       print $1; 
       print "MATCH\n"; 
     } 
} 

ввода в sample.txt, вошел в Баш оболочки

echo "test1" >> sample.txt 
echo "test2" >> sample.txt 
echo "test3" >> sample.txt 
echo "testls4 >> sample.txt 

Выход

test1 
test2 
test3 
testls4 
Use of uninitialized value $1 in print at test.pl line 19. 
MATCH 

ясно, есть совпадение, так как MATCH отображался на выход, но почему $1 все еще не инициализирован? Как ни странно, вне цикла while, у меня нет никаких проблем с $1

+4

В regexp '/ ls /' нет групп захвата, поэтому, конечно, '$ 1',' $ 2' и т. Д. Не определены после того, как это удастся. Что вы ожидали найти в '$ 1'? –

ответ

2

$1 и аналогичные содержат строки, захваченные скобки. Вам нужно окружить свой шаблон регулярного выражения круглыми скобками, чтобы $1 содержал то, что вы соответствовали.

+0

спасибо! не знал о обратных ссылках и добавил скобки работали '($ line = ~ m/(ls) /)' – klx123