我有一个包含此类内容的数组
a/a/a/test134.html
a/a/a/test223.html
a/b/b/test37.html
a/b/test41.html
a/b/test44.html
a/b/test432.html
a/d/test978.html
a/test.html
我需要通过“目录”拆分它,以便我可以将目录的每个数组发送到一个函数中(请参阅代码示例)。
a/a/a/test134.html
a/a/a/test223.html
a/b/b/test37.html
a/b/test41.html
a/b/test44.html
a/b/test432.html
a/d/test978.html
a/test.html
这是我到目前为止所得到的,但我觉得有很多错误,特别是在结束和开始的情况下,并不是我想要的干净。
for(my $i = 0; $i < scalar(@arrayKeys); $i++)
{
my($filename, $directory) = fileparse($arrayKeys[$i]);
my $currDir = $directory;
# $currDir ne $prevDir: takes care of changes in path
# $i + 1 == scalar(@arrayKeys): accounts for last row to be purged
if($currDir ne $prevDir || $i + 1 == scalar(@arrayKeys))
{
# if last row we need to push it
if($i + 1 == scalar(@arrayKeys))
{
push(@sectionArrayKeys, $arrayKeys[$i]);
}
# ensure for first entry run we don't output
if ($prevDir ne "")
{
&output(\@sectionArrayKeys);
}
# Clear Array and start new batch
@sectionArrayKeys = ();
push(@sectionArrayKeys, $arrayKeys[$i]);
}
else
{
push(@sectionArrayKeys, $arrayKeys[$i]);
}
$prevDir = $currDir;
}
答案 0 :(得分:2)
您的脚本令人困惑,但根据我的理解,您希望根据路径将路径数组拆分为新数组。好吧,让它们分开的最简单方法就是使用散列,如下所示:
use warnings;
use strict;
my %dir_arrays;
while (<DATA>) {
chomp;
if (m{^(.+/)([^/]+)$}) {
push @{$dir_arrays{$1}}, $_; # or use $2 for just filename
}
}
use Data::Dumper;
print Dumper \%dir_arrays;
__DATA__
a/a/a/test134.html
a/a/a/test223.html
a/b/b/test37.html
a/b/test41.html
a/b/test44.html
a/b/test432.html
a/d/test978.html
a/test.html
输出:
$VAR1 = {
'a/b/' => [
'a/b/test41.html',
'a/b/test44.html',
'a/b/test432.html'
],
'a/d/' => [
'a/d/test978.html'
],
'a/b/b/' => [
'a/b/b/test37.html'
],
'a/a/a/' => [
'a/a/a/test134.html',
'a/a/a/test223.html'
],
'a/' => [
'a/test.html'
]
};
现在,要将这些数组发送到函数,请执行以下操作:
for my $key (keys %dir_arrays) {
my_function($dir_arrays{$key}); # this sends an array reference
}
如果您希望发送数组而不是数组引用,只需取消引用它:
my_function(@{$dir_arrays{$key}});
编辑:更改了脚本以存储完整路径,因为它更符合问题中的所需输出。