这是一个有趣的问题。最简单的解决方案就是把它全部写出来:
for (@files) {
my ($name, $path, $suffix) = fileparse($_);
push @file_basename, $name;
push @dir_name, $path;
push @ext, $suffix;
}
我们可以抛开所有的清晰性并循环遍历数组引用,将相应的标量推到末尾:
my @collectors = \(@file_basename, @dir_name, @ext);
for (@files) {
my @parse = fileparse($_);
push @{ $collectors[$_] }, $parse[$_] for 0 .. $#collectors;
}
或者我们可以定义一个push3
函数:
sub push3 (\@\@\@@) { # use (+++@) prototype on p5v14 or later
my @arrays = splice @_, 0, 3;
ARG: while (1) {
for (@arrays) {
push @$_, shift;
@_ or last ARG;
}
}
}
或者更一般的multipush
:
sub multipush($@) { # maybe use (+@) on p5v14 or later
my $arrays = shift;
ARG: while (1) {
for (@$arrays) {
push @$_, shift;
@_ or last ARG;
}
}
}
然后:
for (@files) {
push3 @file_basename, @dirname, @ext, fileparse($_);
}
或者
for (@files) {
multipush [\( @file_basename, @dirname, @ext )], fileparse($_);
}
但我认为这种解决方案不优雅、不灵活,并且会提倡使用第一个明确的解决方案。
要真正从 中获取后缀而不是空字符串fileparse
,您必须指定匹配后缀(扩展名)的正则表达式,例如qr/\.[^.]+\z/
.