2015-01-29 2 views
1

Так что я файл Perl- '.rc' (давайте назовем его 'path.rc' с синтаксисом Perl), который имеет следующую строку:Fetching путь файла из Perl '.rc' файла

$RC{model_root} = '/nfs/fm/disks/fm_fabric_00011/abc_rel//xy/xy-abc1-15aa05e' 

I необходимо извлечь файлы из каталога 'xy-abc1-15aa05e'. Я не должен жестко кодировать этот путь в своем файле Perl (давайте назовем это 'Fetch.pl'), поскольку путь может часто меняться, поэтому поддерживается отдельный файл .rc. Я использую:

my $model_root = $RC{model_root}; 

ссылки на пути в моем коде Perl (например, параметр ссылки на пути в гс файле). Как открыть файлы в каталоге 'xy-abc1-15aa05e'? Мой файл Perl не может получить путь :(

Это нарушает остальную часть моего кода ... Как я могу сделать это?

+1

Существует тонны информации не хватает, чтобы быть в состоянии ответить на этот вопрос, но решение, которое вы, возможно, следует использовать, чтобы использовать правильный формат сериализации, если у вас есть файл настроек. – TLP

+0

Итак, на высоком уровне этот файл .rc имеет путь, который я пытаюсь получить/получить из моего кода perl, чтобы открыть файлы, расположенные на этом пути. Файл perl не может получить к нему доступ. Означает ли это, что это звучит немного ясно? – chmod

+0

И файл '.rc' имеет ничего, кроме одной строки: $ RC {model_root} = '/ nfs/fm/disks/fm_fabric_00011/abc_rel // xy/xy-abc1-15aa05e' – chmod

ответ

1

Если вы сделаете свой «гс» файл модуля Perl, как это:

Defs.pm:

package Defs; 

our $path = '/nfs/fm/disks/fm_fabric_00011/abc_rel//xy/xy-abc1-15aa05e'; 

1; 

Тогда вы можете - в сценарии:

#Ensure we can 'find' the defs file, by having a library path that's relative to 
#the script location. 
use FindBin; 
use lib $FindBin::Bin; 

use Defs; 

print $Defs::path, "\n"; 

Если вы specifical вам нужно использовать формат, который вы указали, тогда вам нужно обработать содержимое файла. Один из способов сделать это - eval. Но я не слишком стараюсь это делать, если это абсолютно необходимо.

Вы могли бы сделать что-то подобное, хотя:

use Data::Dumper; 

open (my $rcfile, "<", 'rcfile') or die $!; 
my %RC; 
eval <$rcfile>; 

print Dumper \%RC; 

Я не люблю с помощью Eval в таком роде образом, хотя - вы должны быть очень осторожны относительно ваших входов, так как в противном случае нечетных вещи могут ломаться. (Примечание - это работает только для файла с одной строкой - если у вас несколько строк, вам может понадобиться local $/;, чтобы разделить весь файл, чтобы его оценить).

вместо этого я был бы соблазн использовать регулярное выражение для разбора:

my $model_root; 
while (<$rcfile>) { 
    my ($varname, $value) = (m/\A(\S+) = \'(\S+)\'/); 
    if ($varname eq '$RC{model_root}') { $model_root = $value; } 
} 

print $model_root; 
foreach my $file (glob "$model_root/*") { 
    print "Doing something with $file\n"; 
} 
+0

с использованием регулярного выражения в вашем примере, значение $ должно иметь полный путь ('/ nfs/fm/disks/fm_fabric_00011/abc_rel // xy/xy-abc1-15aa05e'), правильно? Отсюда мне нужно будет войти в каталог: '/ xy-abc1-15aa05e' и открыть файлы. Как вы думаете, я должен использовать еще один цикл и шаблон? – chmod

+0

Да, это то, что извлечено в '$ value'. Относитесь к нему как к каталогу, а 'glob' it:' foreach my $ file (glob "$ value/*") {#do something} ' – Sobrique

+0

Подход регулярного выражения в вашем примере был действительно полезен!(Результат: Выполнение чего-либо с/prod Выполнение чего-либо с/proj) Теперь я могу подключиться к каталогу «xy-abc1-15aa05e» и посмотреть файлы в нем. Я должен иметь возможность использовать обычные файлы для открытия и обработки кодов для чтения этих файлов, не так ли? – chmod

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