use Data::Dumper qw(Dumper);
@arr=split('\/',"\Program Files\Microsoft VisualStudio\VC98\Bin\Rebase.exe");
print(Dumper \@arr);
Run Code Online (Sandbox Code Playgroud)
输出:
$VAR1 = [
'Program FilesMicrosoft VisualStudioVC98BinRebase.exe'
];
Run Code Online (Sandbox Code Playgroud)
所需输出:
$VAR1 = [
'Program Files',
'Microsoft VisualStudio',
'VC98',
'Bin',
'Rebase.exe'
];
Run Code Online (Sandbox Code Playgroud)
你正在分裂正斜线/(逃脱\),而你显然需要\.
由于\它本身逃脱了事物,你也需要逃避它
use warnings;
use strict;
use feature 'say';
my $str = '\Program Files\Microsoft VisualStudio\VC98\Bin\Rebase.exe';
my @ary = split /\\/, $str;
shift @ary if $ary[0] eq '';
say for @ary;
Run Code Online (Sandbox Code Playgroud)
什么打印路径组件,每行一个.
因为这个字符串以\第一个元素开头,所以第一个元素@ary将是一个空字符串,因为它在第一个元素之前\.我们通过shift检查将其从数组中删除.
请注意,此字符串一个必须使用''或操作的形式q(...),因为双引号试图插值推定逃逸\P,\M(等)在字符串中,以警告失败.当你需要插入变量时,最好使用''文字字符串和""(或qq()).
另一种方法是使用正则表达式
my @ary = $str =~ /[^\\]+/g;
Run Code Online (Sandbox Code Playgroud)
在否定字符类,[^...]与(逃脱)\相匹配,是不是任何字符\.量词+意味着在匹配尽可能多的次数时需要至少一个这样的匹配.因此,这匹配到第一个字符序列\.
使用修饰符/g,匹配将继续通过字符串以查找所有此类模式.
分配给数组会将匹配运算符放在列表上下文中,其中将返回匹配列表并将其分配给@ary.在标量上下文中,仅返回true(1)或false(空字符串).
()这里不需要捕获,因为我们想要匹配的所有东西.通常需要它们以便仅返回捕获的匹配.
有了这个,我们不必担心开头的空字符串,因为在第一个字符串之前没有匹配(),因为在我们请求至少一个非字符串之前没有字符\.
但是,使用路径很常见,并且有适用于此的工具,可以处理细节.核心模块File :: Spec是多平台的,其splitdir将路径分解为组件
use File::Spec;
my @path_components = File::Spec->splitdir($str);
Run Code Online (Sandbox Code Playgroud)
如果路径以\(或\在Unix/Mac上)开头,则第一个元素也是空字符串.
感谢SinanÜnür发表评论.