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