所以我有一个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文件无法获取路径:(
这打破了我的其余代码......我怎么能这样做?
答案 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";
}