1

我有这样的路径

/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("/");    
  }
 }

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

4

2 回答 2

6

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

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

在 Unix-ish 系统上。或者你会使用File::Specand splitdir。例如:

#!/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

于 2013-02-09T06:54:52.570 回答
0

split的第一个结果将是传递给它的正则表达式的第一个实例之前的字符串。因为你有一个前导的“/”,你会得到一个空字符串 in $home_dir, 'user' in$user_dir等等。添加undef到列表分配的第一个位置,或者先修剪前导斜杠。

另外我不确定你是否可以在不通过它$curdir的情况下调用 split 。尝试:

(undef, $home_dir, $user_dir, $doc_dir, $loc_dir) = split("/", $curdir);
于 2013-02-09T06:53:34.177 回答