如何正则表达式并获取文件和目录路径

时间:2015-08-28 15:51:28

标签: perl

我的数组(@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";
 }

1 个答案:

答案 0 :(得分:2)

@names声明为my,因此仅限于foreach $dir循环内部。在第二个foreach循环中没有迭代的@names数组。而且,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";
}