2015-08-28 261 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