我有一个包含文件路径的数组。我想拆分数组给我file_name,dir_name和扩展名。我正在尝试使用File :: Basename perl模块。
有人可以帮我实现这个目标:
foreach (@files) {
push((@file_basename,@dir_name,@ext), fileparse($_));
}
我知道我在做什么是不对的..有人可以帮我解决上面的代码吗?
我知道我可以这样做:
$filename = basename($file);
然后将此值推送到数组中。同样,dir和扩展也是如此。只是寻找更好的方式。
提前感谢您的帮助。
答案 0 :(得分:1)
您似乎错过了fileparse
的第二个参数。这是@suffixes
在perldoc中陈述,您正在寻找的内容应如下所示:
my($filename, $directories, $suffix) = fileparse($path, @suffixes);
如果您没有后缀列表,可以执行以下操作:
fileparse("/foo/bar/baz.txt", qr/\.[^.]*/);
哪个应该与任何扩展名匹配。
然后你可以这样修理推送:
for my $file (@l){
my ($name, $path, $suffix) = fileparse($file, qr/\.[^.]*/);
push @name_list, $name;
push @path_list, $path;
push @suffix_list, $suffix;
}
答案 1 :(得分:-1)
这是一个有趣的问题。最简单的解决方案就是全力以赴:
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/
。