如何在perl中用\分割字符串?

Aru*_*aji 0 regex perl split

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)

zdi*_*dim 8

你正在分裂斜线/(逃脱\),而你显然需要\.

由于\它本身逃脱了事物,你也需要逃避它

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发表评论.