从Perl'.rc'文件中获取文件路径

时间:2015-01-29 19:24:13

标签: perl dynamic path rc

所以我有一个Perl'.rc'文件(让我们用Perl语法称它为'path.rc'),该文件有这一行:

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

我需要从目录'xy-abc1-15aa05e'获取文件。我不应该在我的Perl文件中硬编码这个路径(让我们称之为'Fetch.pl')因为路径可能经常变化,所以维护了一个单独的.rc文件。我正在使用:

my $model_root = $RC{model_root}; 

链接到我的Perl代码中的路径(就像链接到rc文件中的路径的参数一样)。我现在如何打开目录'xy-abc1-15aa05e'中的文件?我的Perl文件无法获取路径:(

这打破了我的其余代码......我怎么能这样做?

1 个答案:

答案 0 :(得分: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";

如果您特别需要使用已列出的格式,则需要处理该文件的内容。一种方法是使用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";
}