2015-02-23 69 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