2016-04-05 5 views
0

У меня есть каталог файлов в файловой системе:Извлечь часть файла с Regex в Perl

111111.222.log 
222222.33.log 
444444.0.log 

Если у меня есть доступ к переменной $id, где $id является первой частью чисел до первого . , как мне получить вторую часть номера?

$id - известное значение, вторая часть числа - это то, что я хочу извлечь из имени файла, если он существует.

Есть ли эффективный подход, чтобы сделать это без сохранения всего каталога файлов в массив, а затем пройти через каждый элемент с помощью split?

То, что я имею в виду что-то вроде:

if (-e '$id.(\d+).log') { 
    $unknown = $1; 
} 

выше не является допустимым кодом, просто идея.

В обратном направлении, если у меня есть доступ к полной строке, регулярное выражение я использую для экстракции (где 22 является $unknown):

"158855.22.log" =~ /^(\d+)\.(\d+)\.log$/; 
print "ID is $1\n"; 
print "Unknown is $2\n"; 

ответ

3

Вы можете комбинировать с glob соответствия регулярных выражений:

foreach my $filename (glob "$id.*.log") 
{ 
    if ($filename =~ /^(\d+)\.(\d+)\.log$/) 
    { 
     print "ID is $1\n"; 
     print "Unknown is $2\n"; 
    } 
} 
+0

Да, это работает. Я тестирую его со сценарием в том же каталоге, что и файлы .log. Однако, если я укажу поиск '$ path ="/path/";' и поместил его перед '$ id', он перестанет работать. Есть ли другой способ назначения пути поиска? – KDX

+0

@KDX, Каков абсолютный путь к каталогу с файлами, которые вы тестируете? – 7stud

+0

Это '/ home/kdx/data/log /' где у меня есть файлы. Если я поместил скрипт внутри каталога вместе с файлами, он будет работать. Если я помещаю скрипт вне каталога, даже с указанным путем, он не работает. Кажется, что glob выполняет свою работу только в текущем рабочем каталоге. – KDX

Смежные вопросы