3

my $path = "//strange/path/";

需要使用(一个)前导斜杠 = 获取第一个元素,/strange或者只有/$path 为空或仅包含斜杠。

目前有两种解决方案,例如:

use 5.014;
use warnings;
use File::Spec;
my $path = "//strange/path/";

#version with File::Spec
my $v1 = "/" . ([grep {/./} File::Spec->splitdir($path)]->[0] //  "");
say $v1;

#regex
my $v2 = $path;
$v2 =~ s{^/*}{};
$v2 =~ s{/.*}{};
$v2 =~ s{^}{/};
say $v2;

我不喜欢其中任何一个,因为 1.st 使用模块,而第二个中的 3 个正则表达式简直丑陋。

存在更有效|| 最快的|| “更好”的方法?

4

1 回答 1

2

如果您想要正则表达式,您可以尝试以下“一个正则表达式”解决方案:

use 5.014;
use warnings;
while(<DATA>) {
    chomp;
    my $o = my $n = $_;
    $n =~ s:(^/*)([^/]*)?(/*.*):/$2:;
    say "=$o= =$n=";
}
__DATA__

/
//
strange
strange/
strange/path
/strange
/strange/
/strange/path
//strange
//strange/
//strange/path
//strange//
//strange//
//strange//path

但如上所述@Moritz Bunkus 告诉 - 最好使用标准 File::Spec。

于 2012-08-30T13:35:33.283 回答