0

我有一个包含文件路径的数组。我想拆分数组给我文件名、目录名和扩展名。我正在尝试使用 File::Basename perl 模块。

有人可以帮我实现这一目标:

foreach (@files) {
    push((@file_basename,@dir_name,@ext), fileparse($_));
}

我知道我在做什么是不对的。有人可以帮我修复上面的代码吗?

我知道我可以这样做:

$filename = basename($file);

然后将此值推送到数组中。同样对 dir 和扩展名做同样的事情。只是在寻找更好的方法。

在此先感谢您的帮助。

4

2 回答 2

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;
}
于 2013-04-18T16:42:43.687 回答
-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/.

于 2013-04-18T16:49:08.833 回答