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

Fetching file path from a Perl '.rc' file

所以我有一个 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}; 

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

这破坏了我的其余代码...我该怎么做?

如果您将 'rc' 文件制作成这样的 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";
}