2015-08-28 83 views
-1

我的數組(@array)包含這些目錄結構。在目錄和文件路徑下面。如何正則表達式並獲取文件和目錄路徑

/home/testuser/mysql/data/userdata/pushdir/ 
/home/testuser/mysql/data/userdata/pushdir/test1.sql 
/home/testuser/mysql/data/userdata/nextdir/testdir/ 
/home/testuser/mysql/data/userdata/pushdir/testdir/test2.sql 

/home/testuser/mysql/data/userdata/ - from above list till this line path is constant. 

我想處理文件到另一個循環。爲此,我正在尋找文件名輸出只有像「pushdir/test1.sql」和「pushdir/testdir/test2.sql」

我使用此代碼來獲取,但我沒有得到預期的輸出如「pushdir/test1.sql」和「pushdir/testdir/test2.sql」。請分享你的想法,正則表達式,並得到輸出

foreach $dir(@array) 
{ 
chomp $dir; 
print "$dir\n"; 
@files = <$dir/*>; 
my @names=join("\n", sort(@files)); 
print @names,"\n"; 
} 

foreach my $filepath (@names) { 

    (my $volume,my $dirs, my $filelist) = File::Spec->splitpath(+$filepath); 
    print "$filelist\n"; 
} 
+0

在任何地方都沒有正則表達式。只有一個glob通配符。 – choroba

+0

'嚴格使用;使用警告;'會建議你這個錯誤。 – TLP

+0

你最終想做什麼? –

回答

2

@names都被定義爲my,因此範圍的只有foreach $dir循環中。沒有@names數組可以在第二個foreach循環中迭代。此外,join 返回一個字符串,你可能不希望字符串去數組,你想要個別文件名去那裏。

使用strict(它會告訴你沒有聲明@names)和warnings。正確縮進代碼塊以查看哪些命令屬於哪裏。

#!/usr/bin/perl 
use warnings; 
use strict; 

use File::Spec; 

my @array = qw(home/testuser/mysql/data/userdata/pushdir/ 
       home/testuser/mysql/data/userdata/pushdir/test1.sql 
       home/testuser/mysql/data/userdata/nextdir/testdir/ 
       home/testuser/mysql/data/userdata/pushdir/testdir/test2.sql); 

my @names; 
for my $dir (@array) { 
    print "DIR: $dir\n"; 
    push @names, sort glob "$dir/*"; 
    print "NAMES: @names\n"; 
} 

for my $filepath (@names) { 
    my ($volume, $dirs, $filelist) = 'File::Spec'->splitpath($filepath); 
    print "FL: $filelist\n"; 
} 
+0

謝謝。它的工作.. – bsd

+0

嗨,它的作品部分。我不確定我是否失蹤。但是,我沒有從@array獲取文件名(完整路徑)。排序glob「$ dir/*」結果系統文件列表。我實際上是試圖獲取文件名(文件名的完整路徑)和dirname /文件名單獨(如從文件路徑我正在尋​​找輸出「pushdir/test1.sql」和「pushdir/testdir/test2.sql」)。謝謝 – bsd

+0

@organic:使用'abs2rel'獲取相對路徑。另外,不應該'test2.sql'位於'nextdir'而不是'pushdir'? – choroba

相關問題