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