2015-02-23 51 views
0

因此,我试图拆分具有完整路径到目录的变量时遇到问题。我想获取这个路径的'logs'目录下的文件: '/ nfs/fm/disks/fm_mydiskhere_00000/users/me/repotest/myrepo/tools/toolsdir/logs/*';Perl:将包含路径的变量拆分到目录

在我的Perl脚本中,我有一个包含这个路径的变量:'$ log_file'。当我打印'$ log_file'时,它包含整个路径;我想要转到最后一个目录'logs'并获取它下面的文件。顺便说一句,这个完整路径是正由我的Perl脚本读取一个单独的配置文件是这样的:

sub read_file { 
my ($log_file) = shift(@_); 

info ("Using file : $log_file"); 
my $fh = new FileHandle ("$log_file"); 
printError ("Could not open this file : '$log_file' - $!") unless defined $fh; 

my $contents; 
{ 
    local $/ = undef; 
    $contents = <$fh>; 
} 
$fh->close(); 
eval $contents; 
if ([email protected]) { 
    chomp [email protected]; 
    my $msg = "BAD (perl) syntax in file:\n\[email protected]\n"; 
    if ($msg =~ /requires explicit package name/) { 
     $msg .= "\n -> A 'requires explicit package name' message means". 
      " a NON-VALID variable name was found\n"; 
    } 
    die "Error: $msg\n\n"; 
} 
return 1; 

}

而且我使用变量$ LOG_FILE在另一个子程序中这样说:

my $fh = read_file ($log_file); 
if ($log_file eq "abc.txt"){ 
while (my $line = <$fh>) { 
#do something 
} 
} 

请问有人可以帮我吗?我错过了什么或以错误的方式使用$ log_file?

在此先感谢!

+0

我猜'FileHandle'不能接受通配符。这很有意义,因为文件句柄是单个文件的句柄。尝试将单个文件的路径分配到'$ log_file'中,并查看是否可以缓解您的问题。 – wilkesybear 2015-02-23 23:55:00

+0

我明白你的观点..但是在'/ logs'目录下,有几个文件,我根据它的名字对每个文件执行不同的操作。 $ log_file正在读取整个路径('/ nfs/fm/disks/fm_mydiskhere_00000/users/me/repotest/myrepo/tools/toolsdir/logs/*';),我不知道如何让它读取文件最后的'/ logs'目录。 – chmod 2015-02-23 23:59:29

+0

如何使用[readdir](http://perldoc.perl.org/functions/readdir.html)首先迭代每个文件名,然后将所有逻辑放入该循环中?这是另一个堆栈溢出问题/答案,可能有助于http://stackoverflow.com/questions/6442889/perl-iterate-through-directories/6443023#6443023 – wilkesybear 2015-02-24 00:16:02

回答

0

尝试:

my @files = glob($log_file); 
use Data::Dumper; 
print Dumper(\@files); 
+0

试图在我的'read_file'子例程中包含上面的代码片段。这就是我得到的:$ VAR1 = [/ i]/nfs/fm/disks/fm_infrach_00022/users/npothuku/repotest/ip-psf2/tools/dynamo/logs /' ]; – chmod 2015-02-24 01:15:12

+0

只需尝试我建议的内容 - 根本不需要分割“$ log_file”。 'glob'为你处理所有的操作,并且会列出'$ log_file'指向的位置下的所有文件,例如'my @files = glob('/ nfs/fm/disks/fm_mydiskhere_00000/users/me/repotest/myrepo/tools/toolsdir/logs/*');'应该给你你需要的文件列表。 – TobyLL 2015-02-24 01:21:25

+0

glob将返回完整的文件名,所以不要使用'$ log_file eq“abc.txt”',您可以使用'$ log_file =〜/ \/abc.txt $ /'或使用File :: Basename来提取没有路径的文件名。 – TobyLL 2015-02-24 01:25:47