如何从Perl中的路径中提取目录名称

时间:2013-02-09 06:40:14

标签: perl

我有这样的路径

/home/user/doc/loc

我想分别提取home,user,doc,loc。我试过split (////)split("/") 但他们都没有工作。请给我一些示例脚本:

while (<EXPORT>) {
if (/^di/) { 
    ($key, $curdir) = split(/\t/); 
    printf "the current dir is %s\n", $curdir;
    printf("---------------------------------\n");
    ($home_dir, $user_dir, $doc_dir, $loc_dir) = split("/");    
  }
 }

但它没有用;因此,请帮助我。

2 个答案:

答案 0 :(得分:4)

鉴于包含路径的$curdir,您可能会使用:

my(@names) = split m%/%, $curdir;

在Unix-ish系统上。或者您可以使用File::Specsplitdir。例如:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Spec;

my $curdir = "/home/user/doc/loc";
my(@names) = split m%/%, $curdir;

foreach my $part (@names)
{
    print "$part\n";
}

print "File::Spec->splitdir()\n";
my(@dirs) = File::Spec->splitdir($curdir);

foreach my $part (@dirs)
{
    print "$part\n";
}

输出(包括一个前导空白行):

  


  home
  user
  doc
  loc
  File::Spec->splitdir()
  
  home
  user
  doc
  loc

答案 1 :(得分:-1)

split的第一个结果将是传递给它的正则表达式的第一个实例之前的字符串。由于此处有一个前导“/”,您将在$home_dir中找到一个空字符串,在$user_dir中找到'user',依此类推。将undef添加到列表分配的第一个位置,或者首先修剪前导斜杠。

此外,我不确定你是否可以在不传递$curdir的情况下调用split。尝试:

(undef, $home_dir, $user_dir, $doc_dir, $loc_dir) = split("/", $curdir);