2015-02-23 3 views
0

Так что у меня возникла проблема с разделом переменной, которая имеет полный путь к каталогу. Я хочу получить файлы в каталоге «logs» этого пути: '/ nfs/fm/disks/fm_mydiskhere_00000/users/me/repotest/myrepo/tools/toolsdir/logs/*';Perl: разделение переменной, содержащей путь к каталогу

и в моем скрипте Perl у меня есть переменная, которая содержит этот путь: '$ log_file'. Когда я печатаю '$ log_file', он содержит весь путь; Я хочу перейти в последний журнал журналов и получить файлы под ним. Кстати, этот полный путь находится в отдельном файле конфигурации, который читается мой сценарий Perl так:

sub read_file { 
my ($log_file) = shift(@_); 

info ("Using file : $log_file"); 
my $fh = new FileHandle ("$log_file"); 
printError ("Could not open this file : '$log_file' - $!") unless defined $fh; 

my $contents; 
{ 
    local $/ = undef; 
    $contents = <$fh>; 
} 
$fh->close(); 
eval $contents; 
if ([email protected]) { 
    chomp [email protected]; 
    my $msg = "BAD (perl) syntax in file:\n\[email protected]\n"; 
    if ($msg =~ /requires explicit package name/) { 
     $msg .= "\n -> A 'requires explicit package name' message means". 
      " a NON-VALID variable name was found\n"; 
    } 
    die "Error: $msg\n\n"; 
} 
return 1; 

}

И я использую переменную $ LOG_FILE в другой подпрограмме следующим образом:

my $fh = read_file ($log_file); 
if ($log_file eq "abc.txt"){ 
while (my $line = <$fh>) { 
#do something 
} 
} 

Может ли кто-нибудь помочь мне здесь, пожалуйста? Я что-то упустил или с помощью $ log_file не так?

Заранее благодарен!

+0

Я предполагаю, что 'FileHandle' не в состоянии принимать групповые символы. Это имеет смысл, потому что File Handle - это дескриптор одного файла. Попробуйте назначить путь к одному файлу в '$ log_file' и посмотреть, устраняет ли это ваши проблемы. – wilkesybear

+0

Я получаю вашу точку зрения. Но под каталогом «/ logs» есть несколько файлов, и я выполняю различные операции над каждым файлом в зависимости от его имени. $ log_file читает весь путь ('/ nfs/fm/disks/fm_mydiskhere_00000/users/me/repotest/myrepo/tools/toolsdir/logs/*';), я не уверен, как заставить его читать файлы с в последнем каталоге «/ logs». – chmod

+0

Как использовать [readdir] (http://perldoc.perl.org/functions/readdir.html), чтобы сначала перебирать каждое имя файла, а затем вставлять всю свою логику в этот цикл? Вот еще один вопрос/ответ на переполнение стека, который может помочь http://stackoverflow.com/questions/6442889/perl-iterate-through-directories/6443023#6443023 – wilkesybear

ответ

0

Try:

my @files = glob($log_file); 
use Data::Dumper; 
print Dumper(\@files); 
+0

Пытался включить приведенный выше фрагмент в мою подпрограмму read_file. Это то, что я получаю: $ VAR1 = [ '/ nfs/fm/disks/fm_infrach_00022/users/npothuku/repotest/ip-psf2/tools/dynamo/logs/' ]; – chmod

+0

Просто попробуйте то, что я предложил - вам вообще не нужно разделить '$ log_file'. 'Glob' обрабатывает все, что для вас, и будет перечислять все файлы под именем, указанным' $ log_file', то есть 'my @files = glob ('/ nfs/fm/disks/fm_mydiskhere_00000/users/me/repotest/myrepo/tools/toolsdir/logs/* '); 'должен предоставить вам список необходимых вам файлов. – TobyLL

+0

Glob вернет вам полное имя файла, поэтому вместо использования '$ log_file eq" abc.txt "' вы можете использовать '$ log_file = ~/\/abc.txt $ /' или использовать 'File :: Basename' для извлеките имя файла без пути. – TobyLL

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