2015-07-29 3 views
-1

Мне нужно найти определенную строку в файле, а затем присвоить ее переменной, например: в содержимом файла она написана как CURRENT_RUN_ID=1636, поэтому мне нужно найти строку CURRENT_RUN_ID и назначить его заданное значение, т.е. 1636, до a variable say runvar`, для этого я попробовал ниже, но, похоже, он не работает, вы можете исправить меня здесь?Соответствие шаблону в perl & присвоении

opendir(DAPATH,$sDAPATH) or die "Can't open $sDAPATH: $!"; 
print OUTLOG "\nfound da path : $sDAPATH\n"; 
my @adirs = readdir(DAPATH); 
print OUTLOG "Starting capturing DA\n"; 
my $da = glob "*$runVar.csv*"; 
print OUTLOG "Assigned DA"; 
closedir(DAPATH); 
} 

ответ

0

Здесь вы не соответствуете ни одной из строк при выполнении сопоставления с образцом в строке 18. И даже вы можете уменьшить несколько повторяющихся шагов в коде. Но для вашего удобства я использовал вашу программу.

#!C:\Strawberry\perl\bin 
use strict; 
use warnings; 
my $sSuccessString = "CURRENT_RUN_ID"; 
open(LOG,"$slogfile") or die("Can't open $slogfile\n"); 
my $sLines; 
{ 
local $/ = undef; 
$sLines=<LOG>; 
} 
    if($sLines =~ m/$sSuccessString/){ 
    open(OUTLOG, ">>test.txt"); 
    print OUTLOG "found current run id in log\n"; 
    print OUTLOG "it is found in log as : $sSuccessString \n"; 
    #if ($sLines =~ m/(CURRENT_RUN_ID=.*)/i) { 
    #print OUTLOG "<p>" . $1 . "<\/p>\n"; 
#In below line you need to match the pattern with the line. 
    if ($sLines=~/CURRENT_RUN_ID=(.*)/){ 
    print OUTLOG "we can now assign run id\n"; 
    my $runVar = $1; 
    print "$runVar\n";  
    print OUTLOG "assigned current run id to variable\n"; 
    } 
    else { 
    print "run id not assigned\n"; 
    } 
    } 

Я скопировал ваше содержимое файла журнала в одном из моего текстового файла (prog.txt) на моем рабочем столе и запустил скрипт. См. Выход.

#!C:\Strawberry\perl\bin 
use strict; 
use warnings; 
my $sSuccessString = "CURRENT_RUN_ID"; 
open(LOG,"Prog.txt") or die("Can't open text file\n"); 
my $sLines; 
{ 
local $/ = undef; 
$sLines=<LOG>; 
} 
    if($sLines =~ m/$sSuccessString/){ 
    open(OUTLOG, ">>test.txt"); 
    print OUTLOG "found current run id in log\n"; 
    print OUTLOG "it is found in log as : $sSuccessString \n"; 
    #if ($sLines =~ m/(CURRENT_RUN_ID=.*)/i) { 
    #print OUTLOG "<p>" . $1 . "<\/p>\n"; 
    if ($sLines=~/CURRENT_RUN_ID=(.*)/){ 
    print OUTLOG "we can now assign run id\n"; 
    my $runVar = $1; 
    print "$runVar\n";  
    print OUTLOG "assigned current run id to variable\n"; 
    } 
    else { 
    print "run id not assigned\n"; 
    } 
    } 

ВЫХОДА:
C: \ Users \ hclabv \ Desktop> Perl run1.pl

1637 

И мой лог-файл (test.txt), где мы захватывая журналы во время работы сценарий выглядит следующим образом.

found current run id in log 
it is found in log as : CURRENT_RUN_ID 
we can now assign run id 
assigned current run id to variable 

Для получения файла runVar.csv от требуемого каталога, я добавил ниже фрагмент кода с в цикле, если

opendir(DAPATH,"C:/Users/hclabv/Desktop/Scripting/files") or die "Can't open DAPATH: $!"; 
    print OUTLOG "\nfound da path : DAPATH\n"; 
    my @adirs = readdir(DAPATH); 
    print "csv files @adirs\n"; 
    print OUTLOG "Starting capturing DA\n"; 
    my $csvfile = "$runVar.csv"; 
    foreach my $adirs (@adirs) { 
      if ($adirs eq $csvfile) { 
      print "file found\n"; 
      my $da = $adirs;  
      print "csv file is $da\n"; 
    } 
    print OUTLOG "Assigned DA"; 
    close(DAPATH); 
    } 
+0

@STJ, пожалуйста, отметьте как ответ, если ваша проблема решена с помощью этого решения. – Amareesh

+0

Amareesh, @Arunesh, мне нужно собрать один файл, как в переменной, и это имя файла содержит этот идентификатор запуска, потому что я отправился в это местоположение файла и использую это: my $ da = glob "* $ runVar.csv *" ; но это также, похоже, не работает точно, не могли бы вы мне помочь. – STJ

+0

@STJ Пожалуйста, разместите свой сценарий, который вы пробовали в своем вопросе и что именно вам нужно. Вы хотите получить файл, который содержит этот runid в своем имени в определенном каталоге? – Amareesh

1

Это не соответствует, потому что вы даете пробела в if (/CURRENT_RUN_ID = \s*(.*)/) в match.It ищут пробела в строке.

Узор то, что вы пытаетесь соответствовать будет соответствовать CURRENT_RUN_ID = 1636 строку, обратите внимание на пробелы между CURRENT_RUN_ID и = и после =. Если есть совпадение, то число пробелов в шаблоне должно быть точно таким же, как и нет пробелов в строке.

Пробег между CURRENT_RUN_ID и =, а также после =. Лучше удалить поврежденные места и сделать пространство по желанию, используя \s* попробовать это:

if (/CURRENT_RUN_ID\s*=\s*(.*)/){ 
my $runvar = $1; 
print "$runvar \n"; 
} 

EDIT:

По вашему требованию я изменил сценарий как (я не пишу в файл):

#!/usr/bin/perl 
use strict; 
use warnings; 
open my $fh, '<', 'file' or die "unable to open file : $! \n"; 
my $runVar=""; 
while(<$fh>){ 
     if (/CURRENT_RUN_ID\s*=\s*(.*)/){ 
     print "we can now assign run id\n"; 
     $runVar = $1; 
     print "assigned current run id to variable\n"; 
     } 
     else { 
     print "run id not assigned\n"; 
     } 
} 
close($fh); 
+0

Привет Arunesh, с этим также я получаю ошибку говоря «использование неинициализированного значение $ _ в соответствии с шаблоном (m //) ", вам нужно знать любую другую деталь. – STJ

+0

@STJ показать полный сценарий. –

+0

Я добавил фрагмент в вопрос: когда я использую прокомментированную часть, он печатает его правильно. Также извинения, так как нет места до и после =. – STJ

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