3

もつ

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

(1つの)先頭のスラッシュ=を含む最初の要素を取得する必要があります。または、$ pathが空であるか、スラッシュのみが含まれている場合のみです/strange/

現在、2つの解決策があります。例:

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はモジュールを使用し、2番目の3つの正規表現は単純に醜いので、私はそれらのどれも好きではありません。

より効果的に存在する|| 最速|| 「より良い」方法?

4

1 に答える 1

2

正規表現が必要な場合は、次の「1 つの正規表現」ソリューションを試すことができます。

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 に答える